2013-12-23 12 views
13

Hier ist, wie mein letztes Interview ging:Strings vs Klassen wenn beide Referenztypen

Frage: Wo gespeicherten Strings?

Antwort: Heap, da es eine Referenz-Typ ist

Frage: Erklären Sie mir diesen Code ein:

static void Main(string[] args) 
{ 
    string one = "test"; 
    string two = one; 
    one = one + " string"; 

    Console.WriteLine("One is {0}" , one); 
    Console.WriteLine("Two is {0}", two); 
} 

Antwort: Drew zwei Diagramme wie unten:

(steht für die Aussage string two = one;

enter image description here

(steht für die Aussage, one = one + " string";. Eine neue Zeichenfolge wird auf Heap erstellt und zugewiesen)

enter image description here

Frage: Richtig. Zeichnen ähnlich für den Code-Snippet:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test one = new Test { someString = "test" }; 
     Test two = one; 
     one.someString = "test String"; 

     Console.WriteLine("One is {0}", one.someString); 
     Console.WriteLine("Two is {0}", two.someString); 
    } 
} 

class Test 
{ 
    public string someString { get; set; } 
} 

Antwort:

[Test two = one] enter image description here

one.someString = "test String"; 

enter image description here

Frage: Ok. Sie haben gesagt, strings und classes sind Referenztypen. Warum wurde dann ein neues Objekt für den String erstellt und der Wert zugewiesen, während für die Klasse die vorhandene String-Eigenschaft selbst geändert wird?

Antwort: Weil Zeichenfolgen unveränderlich sind, während Klassen veränderbar sind.

(Obwohl ich das Interview geklärt habe, habe ich dieses Verhalten immer noch nicht verstanden. Warum haben die Designer der Klasse es veränderlich gemacht, während sie die Strings unveränderlich halten? Es gibt viele der rotistischen Antworten überall, aber irgendjemand könnte es einfach machen Erklären dieses besondere Verhalten mit dem obigen Code?)

+2

[Warum .NET String unveränderlich ist?] (Http://stackoverflow.com/questions/2365272/why-net-string-isimmutable) Interessantes lesen, nicht versuchen, irgendwelche Ihrer Punkte über Klassenunveränderlichkeit anzusprechen. –

+0

http://stackoverflow.com/questions/4274193/what-is-the-difference-between-a-mutable-and-immututable-string-in-c – Nahum

+0

http://stackoverflow.com/questions/93091/why -cant-strings-muable-in-java-and-net – Nahum

Antwort

4

Einer der Gründe, weshalb Strings unveränderlich gemacht wurden, obwohl sie Referenztypen sind, bestand darin, sie so aussehen zu lassen und sich wie primitive Typen zu verhalten (z. B. int, double, float).

Das ist auch der Grund, warum Zeichenfolgen der einzige Referenztyp sind, der als ein Literal (z. B. "some string") dargestellt werden kann. Viele andere Sprachen verwenden den gleichen Ansatz wie Java.

0

Strings teilen Puffer. In Ihrem Fall, wenn eins und zwei Strings wären, wären sie separate Objekte (zwei Objekte auf dem Heap), aber intern würden sie auf denselben Puffer zeigen (drittes Objekt auf dem Heap).

3

Zeichenketten sind unveränderlich, weil sie logischerweise ein einzelner Wert sind, und veränderbar würde zu viel unerwartetem Verhalten führen.

jedoch Strings sind nicht Wert Typen, weil sie viel herum geführt werden neigen, die eine Menge Kopieren von Werten erfordern würde. Dies würde insbesondere für große Saiten ziemlich teuer werden.

Um also das Beste aus beiden Welten zu erhalten, sind Strings in .Net Referenztypen, aber auch unveränderlich.

1

Der Befehl one = ... setzt den Zeiger * mit dem Namenone auf einen neuen Wert. Da two ein anderer Zeiger ist, behält es seinen ursprünglichen Wert bei.

Der Befehl one.someString = ... ändert das Objekt, das vonone verwiesen wird. two ist immer noch ein anderer Zeiger, aber da es auf das gleiche Objekt zeigt, werden die Änderungen zwischen ihnen geteilt.