Laden...

Referenzen

Erstellt von GhoBu vor 19 Jahren Letzter Beitrag vor 19 Jahren 3.650 Views
G
GhoBu Themenstarter:in
36 Beiträge seit 2004
vor 19 Jahren
Referenzen

Moin!

Mal was zum genaueren Verständnis der Referenzen:

Wenn ich eine Klasse instanziiere mit z.B.

MyClass c = new MyClass();

Nun übergebe ich diese Instanz einer Methode als Parameter:

doSomethin(c);

Dann arbeite ich in dieser Methode nicht mehr mit der erzeugten Instanz, sondern dieses ist dann eine neue Instanz, die aber alle Felder aus der alten Instanz kopiert hat. Richtig?
Eine Änderung der Felder hat keine Auswirkungen auf die Instanz außerhalb der Methode.

Das heißt, wenn ich diese Instanz durch diese Methode in ein Array, AraayList o.ä. packe, dann kann ich später nicht feststellen, ob meine Original-Instanz 'c' in diesem Array enthalten ist.
Sehe ich das soweit richtig?

Gruß
Jürgen

C
1.215 Beiträge seit 2004
vor 19 Jahren

die klassische frage!
😉

du übergibst referenzen, wie du schon sagtest - es sei denn, es handelt sich um sogenannte wertetypen, dann übergibst du volle kopien mit als formale parameter.

wertetypen sind z.b.: int, double, DateTime, char...
alle anderen, auch arrays und strings sind sogenannte referenztypen (die auch mit null referenziert sein können).

übergibst du einen referenztyp an eine andere methode, so wird das objekt nicht als tiefe kopie übernommen, sondern es kann von der methode geändert werden...
und diese änderung wird auch an deinem ursprungsobjekt deutlich.

ob deine ursprungsinstanz dann z.b. in einer arraylist enthalten ist, kannst du feststellen, in dem du die hash-werte der beiden objekte vergleichst.

grtz
chief

K
64 Beiträge seit 2004
vor 19 Jahren

Hmm ich glaub nich.

"c" is nämlich nicht das Objekt an sich sondern nur ein Verweis auf auf das Objekt (oder eine Variable mit der Speicheradresse des Objektes).

Wenn Du mit der Kopie von "c" etwas anstellst, machst du das also mit dem orginal Objekt.

Bis denne

R
139 Beiträge seit 2004
vor 19 Jahren

kann es sein dass ihr beide das gleiche meint aber nur anders (umständlich) erklärt? 😉

posted by the real prince of persia

K
64 Beiträge seit 2004
vor 19 Jahren

Is mir auch eben grad so aufgefallen 🙂

4.506 Beiträge seit 2004
vor 19 Jahren

Hallo!

Meines Erachtens, arbeitet die Methode wohl mit einer "Kopie", die aber von der "Struktur" her aus dem Original abgeleitet ist.

Also ich wüßte nicht, dass eine Veränderung in einer Methode das Originalobjekt verändert.

Ich denke folgendes Beispiel zeigt deutlich was Sache ist:



public class Test
{
	public static int var1;

	Test()
	{
		var1 = new int();
		var1 = 5;

		Verändere(var1);
	}

	private void Verändere(int myInt)
	{
		myInt = 3;
		Console.WriteLine("Local: {0} Global: {1}", myInt, Test.var1);
	}
}

Falls weitere Fragen sind, dann fragen!

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

X
2.051 Beiträge seit 2004
vor 19 Jahren

@norman_timo
liest dir mal Beitrag von Chief Brodie genau durch

1.373 Beiträge seit 2004
vor 19 Jahren

Dann lies dir bitte nochmal den Post von norman_timo durch: int ist ein Wertetyp, und wird entsprechend als Wert übergeben (=kopiert) - anders als Objekte einer Klasse (=Referenztyp).

MfG VizOne

[edit]Hm, zu spät 😉 [/edit]

4.506 Beiträge seit 2004
vor 19 Jahren

Hallo!

Also wenn ich jetzt nicht wirklich verkehrt liege:

Im C# gibt es keine Wertetypen mehr. Es sind alles Objekte !!!

Auch ein normaler "Int" ist ein Objekt! Das ist ja genau das geniale, oder wie hier festgestellt, das total verwirrende an C#.

Es ist völlig gleichgültig ob es ein Int oder eine Klasse ist, beides wird hier als Objekt behandelt.

Stellt man schon fest, wenn man eine Int-Variable mit einer Methode verbinden will:



int a = new int();

a=2;

Console.WriteLine("{0}",a.GetType());


Hier ist z.B. die Methode GetType() benutzt worden!

Also... -> Int ist hier ein Objekt, genau wie eine Klasse auch!

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

C
1.215 Beiträge seit 2004
vor 19 Jahren

oha!
das ist aber ein irrtum...

es gibt sehr wohl eine unterteilung in referenz- und wertetypen in c#...

versuche mal, ein int mit null zu refernzieren.
😉

grtz
chief

X
2.051 Beiträge seit 2004
vor 19 Jahren

@norman_timo
Sieh mal in der Hilfe nach System.ValueType

N
4.644 Beiträge seit 2004
vor 19 Jahren

Schau Dir mal dieses Beispiel an, die Variable name wird im entsprechenden Objekt geändert, da RefernzTyp. Ersetze bitte class durch struct und starte das Programm neu (struct ist ein WerteTyp).
Bitte keine Kommentare wegen der public Variablen, da dieser Code nur zu Demozwecken gedacht ist, sonst sind diese private.

class XYZ
{
	private void Test(Person c)
	{
		c.name = "NeuerName";
	}

	private void button1_Click(object sender, System.EventArgs e)
	{
		Person c = new Person("Name");
		MessageBox.Show(c.name);
		Test(c);
		MessageBox.Show(c.name);
	}
}

public class Person
{
	public string name;
	public Person(string name)
	{
		this.name = name;
	}
}
4.506 Beiträge seit 2004
vor 19 Jahren

Ok!

Vielleicht habe ich hier die Begriffe ein Wenig durcheinander gebracht?

Dann sollte mir aber jemand mal erklären, wie man eine Klasse (also ein Referenztyp) übergibt.

Ich dachte man versucht die Referenzübergabe in C# zu vermeiden?

Wie löse ich dann ein Problem mit einer Methode, die Referenzwerte verändern soll?

Vielleicht werd ich dann auch schlauer, oder ich hab grad n Kuddelmuddelproblem im Kopf?

Auf eure Antwort...

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

C
1.215 Beiträge seit 2004
vor 19 Jahren

das musst du selber machen.

wenn du einen referenz-typ als formalen parameter verwendest, sollte dieser 'IClonable' implementieren, wenn du eine eigenständige kopie des objektes für deine methode haben willst.
mit 'Clone()' erstellst du dann eine sogenannte 'Tiefe Kopie'.
oder du machst das zufuss, indem du ein neues objekt in der methode erstellst, dem du alle eigenschaften des parameter-objektes zuweisst.

in VB gibt es da die anweisungen 'ByRef' und 'ByVal', die festlegen, welche art von kopie man haben will - flach oder tief.

grtz
chief

R
139 Beiträge seit 2004
vor 19 Jahren

schau dir mal die ref-/out-parameter an. ansonsten wurde schon "alles" wichtige gesagt.

gruß,

r00t

posted by the real prince of persia