2009-02-10 5 views
5

Hilf mir hier einen Streit zu lösen.C# - Wird dieser deklarierte String als Const behandelt?

Ist das:

SqlCommand cmd = new SqlCommand("sql cmd", conn); 

behandelt genau das gleiche wie folgt aus:

const string s = "sql cmd"; 
SqlCommand cmd = new SqlCommand(s, conn); 

Ie. macht es einen Unterschied, wenn ich speziell feststelle, dass die Zeichenkette s eine Konstante ist.

Und wenn es nicht auf die gleiche Weise behandelt wird, warum nicht?

+0

Warum haben Sie dies zu einem Community-Wiki? – GEOCHET

+0

Twas ein Fehler - ich wusste nicht, was ein CW war. –

Antwort

6

Im letzteren Schnipsel, es ist nicht, dass die String const - es ist, dass die Variable const ist. Das ist nicht ganz dasselbe wie const in C++. (Strings sind immer unveränderlich in .NET.)

Und ja, die beiden Schnipsel machen das gleiche. Der einzige Unterschied besteht darin, dass Sie in der ersten Form auch einen Metadateneintrag für s haben. Wenn die Variable auf Typebene deklariert wird (anstatt eine lokale Variable zu sein), könnten andere Methoden sie ebenfalls verwenden. Natürlich, aufgrund der String-Internierung, wenn Sie "sql cmd" woanders verwenden Sie nur eine einzige Zeichenfolge Objekt im Speicher ... aber wenn Sie den Typ mit Reflexion betrachten, finden Sie die Konstante als ein Feld in den Metadaten mit dem zweiten Snippet, wenn es als konstantes Feld deklariert ist, und wenn es nur eine lokale Variable ist, wird es in der PDB-Datei enthalten sein, wenn Sie eine erstellen.

1

Der Konstruktor des SqlCommand wird keinen Unterschied "sehen" und wird daher genauso verfahren.

1

Ja, das sind genau die gleichen.

0

Ich bin mir nicht 100% sicher, aber ich wette, es ist das gleiche.

const wird nur sicherstellen, dass Sie die Variable nicht definieren, aber es ist etwas, das zur Kompilierzeit getan werden kann.

Darüber hinaus sind Strings unveränderbar, also glaube ich nicht, dass es einen Unterschied machen wird, die Variable zu deklarieren oder nicht.

Der endgültige Beweis würde jedoch der in beiden Fällen generierte IL-Code sein.

+0

Das hört sich eher so an, als würden Sie "readonly" beschreiben - "const" tut mehr als das (der Wert wird ** direkt ** von Anrufern kopiert - es ist kein "LDLLD"/"LDSFLD". –

+0

Sorry, aber ich tue nicht verstehe dich nicht vollständig.Was meinst du damit, wenn du sagst "der Wert wird ** direkt ** von Anrufern kopiert"? Von MSDN: ein const-Feld ist eine Kompilierzeitkonstante http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx – rgargente

2

Der Wert eines const wird immer direkt in den Aufrufer gebrannt, also ja sie sind identisch.

Darüber hinaus ist der Compiler Praktikanten Strings im Quellcode gefunden - a const ist hilfreich, wenn Sie die gleiche Zeichenfolge mehrmals verwenden (rein aus einem Wartungswinkel - das Ergebnis ist das gleiche oder so).

1

Ja, fühlen Sie sich frei, Reflector zu verwenden, um die Assembly zu betrachten, const Strings werden mit literalen Strings beim Kompilieren ersetzt. Ich habe auch eine blog post über diese, um Sie die Arbeit der Verwendung von Reflektor zu sichern :)

+0

Alle Literalzeichenfolgen werden von der aktuellen CLR interniert. Es hat nichts mit const zu tun, was nur die Variable und nicht die String-Instanz selbst betrifft (aber Strings sind in .NET unveränderlich) –

Verwandte Themen