5 Stimmen

Was ist der Grund dafür, dass Strings in .NET auf null initialisiert werden?

Ich weiß, dass String ein Objekt ist, im Gegensatz zu z. B. Int, und Objektvariablen zeigen im Allgemeinen auf nichts, es sei denn, Sie erstellen das Objekt. Ich weiß also, wie es funktioniert.

Aber warum initialisiert .NET in Bezug auf einfache, praktische Programmierung eine Zeichenkette nicht als leer (""), da dies sicherlich die häufigste Verwendung der String-Variable ist - als Zeichenkette, nicht als Objekt?

Ich habe nie (noch) hatte Notwendigkeit für eine Zeichenfolge zu null, das heißt "nicht eine Zeichenfolge" sein. Es scheint eine seltene Anforderung zu sein. Ich bin nicht in der Lage zu sagen, dass eine int-Variable null ist, warum also mit String? Es als Option zu haben, ist zweifellos notwendig, aber warum macht .NET sie von vornherein zu null, wenn int usw. richtige Anfangswerte erhalten?

Ich frage, weil ich nicht nur verstehen möchte, wie etwas funktioniert, sondern auch, warum, weil ich dann weniger Lust habe, darüber zu schimpfen, wie seltsam es scheint :)

7voto

Matthew Punkte 12197

Strings werden nicht initialisiert als null . Sie verwechseln Initialisierung mit Deklaration. Wann immer Sie eine Variable deklarieren wie:

 Foo myFoo;

Sie beginnt als Null, bis Sie ihren Konstruktor aufrufen. Zum Beispiel so:

Foo myFoo = new Foo();

Nun rufen Sie traditionell keine Konstruktoren für die String-Klasse auf, sondern instanziieren sie mit String-Literalen wie diesem:

string myString = "foo";

Es gibt zwar Konstruktoren für die String-Klasse, ein paar von ihnen, aber sie alle nehmen einige Array von Zeichen / Bytes zu verwenden, um die Zeichenfolge zu erstellen. Was nie passiert, ist dies:

// initialize an empty string ("")
string myString = new string();

Das liegt daran, dass die String-Klasse unveränderlich Das heißt, wenn sie einmal instanziiert wurde, kann man sie nicht mehr ändern, man kann nur eine neue Zeichenkette erstellen und die Variable so einstellen, dass sie auf diese verweist (deshalb geben alle Methoden der Klasse string eine neue Zeichenkette zurück, anstatt diejenige zu ändern, mit der man die Methode aufgerufen hat). Es macht also keinen Sinn, eine Variable auf einen Standardwert zu initialisieren, denn wenn man das einmal getan hat, ist man an diesen Wert gebunden.

4voto

Mark Byers Punkte 761508

String ist ein Referenztyp. Der Standardwert für alle Referenztypen ist null . Dies ist durch die Sprache C# definiert und es gibt keine Möglichkeit, dieses Verhalten zu ändern.

Auch wenn die Designer der String Klasse gesucht den Wert von default(String) die leere Zeichenkette sein (was ich bezweifle), ist es einfach nicht möglich, sie zu ändern.

0voto

Ilian Punkte 4970

Denn string ist ein Referenztyp und Referenztypen sind standardmäßig mit null . Es ist einfach ein konsequentes Verhalten. Es würde mich überraschen, wenn das System auf etwas anderes eingestellt wäre.

Mir fällt ein Beispiel ein, bei dem Null-Strings als Standardwert tatsächlich sinnvoll sind. Nehmen wir an, Sie parsen die folgenden XML-Knoten für den Namen attribute .

<node name=""/>
<node />

Wie kann man bei der folgenden Struktur die 2 Knotenpunkte unterscheiden?

struct Node
{
  public string Name { get; }
}

Für <node name=""/> sieht Ihr Parser die name Attribut und setzt dann Node.Name a string.Empty . Für <node /> sieht Ihr Parser nicht die name Attribut und weist nichts zu.

Es bleiben also folgende Möglichkeiten Node.Name==string.Empty für den ersten Knoten und der zweite Knoten hätte Node.Name==null . Das macht Sinn.

-1voto

xanatos Punkte 105813

Die Frage ist mit einer anderen Frage verbunden Warum ist String ein Referenztyp?

Als sie sich für string s zu Referenztypen zu machen, mussten sie eindeutig default(string) == null in der gleichen Weise, wie default(any reference type) == null .

Eine intelligentere Frage wäre dann: "Warum sind Strings Referenztypen und nicht zum Beispiel ein struct String { private char[] MyInternalSting; } ? Weil sie es so beschlossen haben (selbst der Link, den ich angegeben habe, enthält mehr kyrillische Denklogik als echte Gründe... Wie z.B. "weil man sonst nichts machen könnte Object.ReferenceEquals ", als ob du das tun könntest Object.ReferenceEquals mit Zahlen und anderen Werttypen).

Weitere intelligente Fragen könnten sein, warum "A" + null == "A" anstelle von NullPointerException o ArgumentNullException ? (ich war nicht in der Lage, eine intelligente Antwort zu finden... Vielleicht für die Kompatibilität mit VB.NET)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X