解釋C#中const和readonly關鍵字的區別
在C#中,const和readonly關鍵字都用於定義不可變的值,一旦宣告就不能修改。但是,兩者之間存在一些重要的區別。
const
const修飾符宣告在編譯時已知的常量值,並且不會改變,即它們是不可變的。在C#中,你只能將內建型別標記為const。使用者定義的型別(例如類、結構體等)不能是const。此外,類成員型別(例如方法、屬性或事件)也不能標記為常量。
必須在宣告期間初始化常量。
class Period{
public const int hours = 12;
public const int minutes = 60;
}常量可以標記任何可見性修飾符,即private、public、protected、protected internal或private protected。
常量也充當靜態值,即常量的值對於類的所有例項都是相同的。不必用static關鍵字顯式標記它們。不能使用該類的例項變數訪問常量,而必須使用類名。
readonly
標記為readonly的欄位只能在宣告期間或在建構函式中賦值。一旦建立了類的例項,就不能修改readonly欄位。
如果欄位是值型別,則將其標記為readonly使其不可變。另一方面,如果readonly欄位是引用型別,則你仍然可以更改變數引用的物件的資料。但是,你不能更改該引用以指向一個新物件。
class Person{
private readonly string _title;
private readonly string _skill;
public Person(string title, string skill){
_title = title;
_skill = skill;
}
}可以在欄位宣告和任何建構函式中多次賦值readonly欄位。此外,它可以根據所使用的建構函式具有不同的值。
兩者之間的一個重要區別是在一個程式集中宣告的const或readonly欄位在另一個程式集中編譯時的情況。
對於const值,它就像查詢替換一樣。常量值被“嵌入”到第二個程式集的中間語言中。這意味著如果你更新了常量,第二個程式集仍然會保留第一個值,直到你重新編譯它。
對於readonly值,它就像對記憶體位置的引用。該值不會嵌入到第二個程式集的中間語言中。這意味著如果更新了記憶體位置,第二個程式集無需重新編譯即可獲得新值。更新readonly欄位意味著只需要編譯第一個程式集,而不需要任何使用者程式集進行編譯。
示例
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
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP