Was ist der Unterschied zwischen const
y readonly
in C#?
Wann würden Sie das eine dem anderen vorziehen?
Was ist der Unterschied zwischen const
y readonly
in C#?
Wann würden Sie das eine dem anderen vorziehen?
Abgesehen von dem offensichtlichen Unterschied von
const
VS readonly
Werte können dynamisch berechnet werden, müssen aber zugewiesen werden, bevor der Konstruktor beendet wird. Danach wird er eingefroren.const
sind stillschweigend static
. Sie verwenden eine ClassName.ConstantName
Notation, um auf sie zuzugreifen.Es gibt einen feinen Unterschied. Betrachten Sie eine Klasse, die in AssemblyA
.
public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly int I_RO_VALUE;
public Const_V_Readonly()
{
I_RO_VALUE = 3;
}
}
AssemblyB
Referenzen AssemblyA
und verwendet diese Werte im Code. Wenn dieser kompiliert wird:
const
Wert, ist es wie ein Suchen-Ersetzen. Der Wert 2 wird in die Datei AssemblyB
's IL. Das heißt, wenn ich morgen die I_CONST_VALUE
bis 20, AssemblyB
würde noch 2 haben, bis ich es neu kompiliere .readonly
Wert, ist es wie ein ref
auf einen Speicherplatz. Der Wert wird nicht in AssemblyB
's IL. Das bedeutet, dass, wenn der Speicherplatz aktualisiert wird, AssemblyB
erhält den neuen Wert ohne Neukompilierung. Wenn also I_RO_VALUE
auf 30 aktualisiert wird, müssen Sie nur noch die AssemblyA
und alle Clients müssen nicht neu kompiliert werden.Wenn Sie also sicher sind, dass sich der Wert der Konstante nicht ändern wird, verwenden Sie eine const
.
public const int CM_IN_A_METER = 100;
Aber wenn Sie eine Konstante haben, die sich ändern kann (z.B. in Bezug auf die Genauigkeit), oder wenn Sie Zweifel haben, verwenden Sie eine readonly
.
public readonly float PI = 3.14;
Update: Aku muss erwähnt werden, weil er zuerst darauf hingewiesen hat. Außerdem muss ich angeben, wo ich das gelernt habe: Effektives C# - Bill Wagner
Ich möchte nur hinzufügen, readonly
für Referenztypen macht nur die Referenz lesbar, nicht die Werte. Zum Beispiel:
public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};
public UpdateReadonly()
{
I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
I_RO_VALUE = new char[]{'V'}; //will cause compiler error
}
}
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.