Heim > Artikel > Backend-Entwicklung > Der Unterschied zwischen const und readonly in c#.net
(1) readonly und const werden beide zum Markieren von Konstanten verwendet.
(2) Die Initialisierungsaufgabe ist unterschiedlich.
Const, das durch const geändert wurde, muss gleichzeitig mit der Deklaration ein Wert zugewiesen werden. Zum Beispiel:
public class Class1 { public const int MaxValue = 10; //正确声明 public const MInValue; //错误:常量字段要求提供一个值 public Class1() { MinValue = 10; } }
schreibgeschützte Felder können während der Initialisierung (Deklaration oder Konstruktor) zugewiesen werden. Daher können schreibgeschützte Felder je nach verwendetem Konstruktor unterschiedliche Werte haben.
public class Class1 { public readonly int c = 10; //正确声明 public readonly int z; public Class1() { z = 24;//正确 } protected void Load() { z = 24;//错误:无法对只读的字段赋值(构造函数或变量初始值指定项中除外) } }
readonly ist ein Instanzmitglied, sodass verschiedene Instanzen unterschiedliche konstante Werte haben können, was readonly flexibler macht.
public readonly Color Red = new Color(255, 0, 0); public readonly Color Green = new Color(0, 255, 0); public readonly Color Blue = new Color(0, 0, 255);
(3) const-Felder sind Konstanten zur Kompilierungszeit, während schreibgeschützte Felder für Laufzeitkonstanten verwendet werden können.
const erfordert, dass der Compiler zur Kompilierungszeit einen bestimmten Wert berechnen kann. Zur Kompilierungszeit wird jede Stelle, an der die Konstante aufgerufen wird, durch den berechneten Wert ersetzt. Daher können Sie keinen Wert aus einer Variablen extrahieren, um eine Konstante zu initialisieren.
readonly ermöglicht das Festlegen eines Felds auf eine Konstante, kann jedoch einige Operationen ausführen und seinen Anfangswert bestimmen. Da Readonly zur Berechnungszeit ausgeführt wird, kann es mit bestimmten Variablen initialisiert werden. Dieser Wert wird zur Laufzeit ermittelt.
(4) const ist standardmäßig statisch und readonly muss explizit deklariert werden, wenn es auf static gesetzt ist.
(5) Der durch const geänderte Werttyp ist ebenfalls begrenzt. Er kann nur einer der folgenden Typen sein (oder in die folgenden Typen konvertiert werden): sbyte, byte, short, ushort, int, uint, long , ulong, char, float, double, decimal, bool, string, enum type oder reference type. Beachten Sie, dass der Referenztyp, der als const deklariert werden kann, nur ein String oder ein anderer Referenztyp sein kann, dessen Wert null ist. readonly kann von jedem beliebigen Typ sein.
Das heißt, wenn wir eine const-Konstante benötigen und ihr Typ die Berechnung eines bestimmten Werts zur Kompilierungszeit einschränkt, können wir das Problem lösen, indem wir sie als statisch schreibgeschützt deklarieren. Aber es gibt immer noch einen kleinen Unterschied zwischen den beiden. Schauen Sie sich die beiden verschiedenen Dokumente unten an.
file1.cs
using System; namespace MyNamespace1 { public class MyClass1 { public static readonly int myField = 10; } }
file2.cs
namespace MyNamespace2 { public class MyClass1 { public static void Main() { Console.WriteLine(MyNamespace1.MyClass1.myField); } } }
Die beiden Klassen gehören zu zwei Dateien file1.cs und file2.cs und werden separat kompiliert. Wenn die Domäne myField in der Datei file1.cs als statisch schreibgeschützt deklariert ist und wir den Wert von myField aus irgendeinem Grund auf 20 ändern, müssen wir beim Ausführen von file2 nur die Datei file1.cs in file1.dll neu kompilieren. exe Das heißt, Sie erhalten 20.
Wenn Sie jedoch static readonly in const ändern und dann den Initialisierungswert von myField ändern, müssen wir alle Dateien, die auf file1.dll verweisen, neu kompilieren, andernfalls ist das von uns referenzierte MyNamespace1.MyClass1.myField nicht wie erwartet . Dies ist besonders bei der Entwicklung großer Systeme zu beachten.
(6) Objekt, Array (Array) und Struktur (Struktur) können nicht als konstante Konstanten deklariert werden.
Das Obige ist der Unterschied zwischen const und readonly in c#.net. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!