Heim >Backend-Entwicklung >C#.Net-Tutorial >Erklären Sie den Unterschied zwischen const- und readonly-Schlüsselwörtern in C#
In C# werden sowohl const- als auch readonly-Schlüsselwörter verwendet, um unveränderliche Werte zu definieren, die nach der Deklaration nicht geändert werden können. Es gibt jedoch einige wichtige Unterschiede zwischen den beiden. Der Modifikator
const deklariert konstante Werte, die zur Kompilierungszeit bekannt sind und sich nicht ändern, d. h. sie sind unveränderlich. In C# können nur integrierte Typen als const markiert werden. Benutzerdefinierte Typen (wie Klassen, Strukturen usw.) können nicht konstant sein. Darüber hinaus können Klassenmitgliedstypen (z. B. Methoden, Eigenschaften oder Ereignisse) nicht als Konstanten markiert werden.
Sie müssen Konstanten während der Deklaration initialisieren.
class Period{ public const int hours = 12; public const int minutes = 60; }
Konstanten können mit jedem Sichtbarkeitsmodifikator markiert werden, d. h. privat, öffentlich, geschützt, geschützt intern oder privat geschützt.
Konstanten fungieren auch als statische Werte, d. h. der Wert der Konstante ist allen Instanzen der Klasse zugeordnet. Sie müssen sie nicht explizit mit dem Schlüsselwort static markieren. Sie können nicht über Instanzvariablen der Klasse auf Konstanten zugreifen, Sie müssen den Klassennamen verwenden.
Als schreibgeschützt markierte Felder können nur deklariert oder in einem Konstruktor verwendet werden. Sobald eine Instanz einer Klasse erstellt wurde, können schreibgeschützte Felder nicht mehr geändert werden.
Wenn es sich bei dem Feld um einen Werttyp handelt, wird es durch Markieren als schreibgeschützt unveränderlich. Wenn es sich bei dem schreibgeschützten Feld hingegen um einen Referenztyp handelt, können Sie die Daten des Objekts, auf das sich die Variable bezieht, immer noch ändern. Sie können den Verweis jedoch nicht so ändern, dass er auf ein neues Objekt verweist.
class Person{ private readonly string _title; private readonly string _skill; public Person(string title, string skill){ _title = title; _skill = skill; } }
Schreibgeschützte Felder können in der Felddeklaration und in jedem Konstruktor mehrfach zugewiesen werden. Darüber hinaus kann es je nach verwendetem Konstruktor unterschiedliche Werte haben.
Ein wichtiger Unterschied zwischen den beiden besteht darin, dass in einer Assembly deklarierte const- oder readonly-Felder kompiliert werden, wenn sie in einer anderen Assembly verwendet werden.
Für konstante Werte ist es wie Suchen und Ersetzen. Der konstante Wert wird in die Zwischensprache der zweiten Assembly „eingebrannt“. Das heißt, wenn Sie die Konstante aktualisieren, hat die zweite Assembly weiterhin den ersten Wert, bis Sie sie neu kompilieren.
Für schreibgeschützte Werte ist es wie eine Referenz auf einen Speicherort. Der Wert ist nicht in die Zwischensprache der zweiten Assembly eingebettet. Dies bedeutet, dass bei einer Aktualisierung des Speicherorts die zweite Assembly den neuen Wert erhält, ohne dass eine Neukompilierung erforderlich ist. Das Aktualisieren eines schreibgeschützten Felds bedeutet, dass nur die erste Assembly kompiliert werden muss, keine Benutzer-Assemblys.
Echtzeitdemonstration
using System; class Program{ static void Main(){ Console.WriteLine(Period.HOURS); var person = new Person("John", "Programmer"); person.Print(); } } class Period{ public const int HOURS = 12; public const int MINUTES = 60; } class Person{ private readonly string _title; private readonly string _skill; public Person(string title, string skill){ _title = title; _skill = skill; } public void Change(string skill){ // Error: A readonly field cannot be assigned to // this._skill = skill; } public void Print(){ Console.WriteLine($"{_title}: {_skill}"); } }
12 John: Programmer
Das obige ist der detaillierte Inhalt vonErklären Sie den Unterschied zwischen const- und readonly-Schlüsselwörtern in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!