Verweis auf eine andere Zeichenfolge in C # erstellen

Soweit ich weiß, ist eine Zeichenfolge in C # ein Referenztyp.

Im folgenden Code sollte 'a' also gleich "Hi" sein, aber es behält seinen Wert bei, der "Hello" ist. Warum?

<code>string a = "Hello";
string b = a;
b = "Hi";
</code>
 porges04. Apr. 2012, 07:28
@ZeNo: Dies hat nichts mit der Unveränderlichkeit von Strings zu tun. Es ist ein normales Verhalten des Referenztyps.
 SimpleVar04. Apr. 2012, 07:29
 ZeNo04. Apr. 2012, 07:27

Antworten auf die Frage(5)

Lösung für das Problem

dass Zeichenfolgen unveränderlich sind. Das ist zwar wahr, aber für Ihre Frage völlig irrelevant.

Relevanter ist, dass Sie falsch verstehen, wie Referenzen in Bezug auf Variablen funktionieren. Eine Referenz ist keine Referenz auf aVariable. Stellen Sie sich eine Referenz als ein Stück Schnur vor. Sie beginnen damit:

<code>a----------------------Hello
</code>

Dann sagst du "b = a", was bedeutetbefestigen Sie ein weiteres Stück Schnur an der gleichen Sache, diea ist angehängt an:

<code>a----------------------Hello
                      /
b---------------------
</code>

Dann sagst du "jetzt b an Hi anhängen"

<code>a----------------------Hello

b----------------------Hi
</code>

Sie denken entweder, dass Referenzen so funktionieren:

<code>a----------------------Hello
</code>

Dann sage ich dasb ist ein anderer Name füra:

<code>a/b ----------------------Hello
</code>

Dann ziehe ich mich umb, was sich änderta, weil es zwei Namen für dasselbe sind:

<code>a/b ----------------------Hi
</code>

Oder vielleicht denken Sie, dass Referenzen so funktionieren:

<code>a----------------------Hello
</code>

Dann sage ich dasb bezieht sich aufa:

<code>b -------------- a ----------------------Hello
</code>

Dann ziehe ich mich umb, was sich indirekt änderta:

<code>b -------------- a ----------------------Hi
</code>

Das heißt, Sie erwarten einen Verweis auf aVariable, anstelle einerWert. Siekönnen mach das in c # so:

<code>void M(ref int x)
{
    x = 1;
}
...
int y = 0;
M(ref y);
</code>

Das bedeutet "für die Dauer des Anrufs an M ist x ein anderer Name für y". Eine Änderung an x ​​ändert y, da es sich um dieselbe Variable handelt. Beachten Sie, dass dieArt der Variablen muss kein Referenztyp sein.

Die Linieb = "Hi"; Ändert die Zeichenfolgeb Verweise.a noch Referenzen"Hello".

<code>string a = "Hello";  // Set a to reference the string "Hello"
string b = a;        // Set b to reference the same string as a
b = "Hi";            // Set b to reference the string "Hi"
</code>

Sie haben zwei Verweise ('a', 'b') auf eine Zeichenfolge "Hallo" erstellt. Mitb = "Hi" Sie ändern 'b', um auf die Zeichenfolge "Hi" zu verweisen.

'a' wird sich niemals so ändern.

während das Objekt unberührt bleibt. B = "Hi" kopiert also einen Verweis auf das Objekt "Hi" nach b. Dies betrifft nicht a.

rendste.

Führen Sie den folgenden Code aus, und Sie werden überrascht sein, die Antwort zu sehen:

Erstellen Sie eine einfacheBook Klasse mit einer Eigenschaft namensName und schreibe den folgenden Code in dasMain Methode der Anwendung.

<code>Book a = new Book() {Name = "book a"};
Book b = new Book() {Name = "book b"};

Book c = a; //line 3

Book a = b; //Line 4

Console.WriteLine(c.Name);
</code>

Und zweifellos werden Sie aufgrund von Zeile 4 erwarten, dass die Antwort "Buch b" lautetc ista und danacha wurdenb was auch machen wirdc gleichb.

Welches ist nicht der Fall!

Lesen Sie die Ballonanologie unterBallon-Analogie für Referenztyp.

 Dhananjay04. Apr. 2012, 10:45
Ok, ersetze das Buch im Beispiel durch einen String und überprüfe, ob du die gleiche Frage hättest stellen sollen oder nicht.
 Nour Sabouny04. Apr. 2012, 12:08
Ok, ich habe nicht bemerkt, dass diese Zeile (a = "Hi") so aussieht, als würde die Variable (a) auf ein anderes Objekt verweisen. Ich dachte, sie ändert das Objekt, auf das sich die Variable (a) bezieht.
 Nour Sabouny04. Apr. 2012, 09:24
eigentlich weiß ich das schon :)

Ihre Antwort auf die Frage