C#修飾符readonly和const

參考:


區(qū)別:

  • readonly 關(guān)鍵字不同于 const 關(guān)鍵字。 const 字段只能在該字段的聲明中初始化。 可以在字段聲明和任何構(gòu)造函數(shù)中多次分配 readonly 字段。 因此,根據(jù)所使用的構(gòu)造函數(shù),readonly 字段可能具有不同的值。 另外,雖然 const 字段是編譯時常量,但 readonly 字段可用于運行時常量,如下面的示例所示:

一. const

1. 特點:

  • 常量是不可變的值,在編譯時是已知的,在程序的生命周期內(nèi)不會改變。
  • 僅 C# 內(nèi)置類型(不包括 System.Object)可聲明為 const
  • 常量在聲明時必須初始化。 例如:
class Calendar1
{
    public const int Months = 12;
}

在此示例中,常量 Months 始終為 12,即使類本身也無法更改它。 實際上,當編譯器遇到 C# 源代碼中的常量標識符(例如Months )時,它直接將文本值替換到它生成的中間語言 (IL) 代碼中。 因為運行時沒有與常量相關(guān)聯(lián)的變量地址,所以 const 字段不能通過引用傳遞,并且不能作為l-value在表達式中顯示。

  • 常量像靜態(tài)字段一樣被訪問,因為他的值對于所有類型的實例是一樣的。你不需要用static關(guān)鍵字去聲明他們。訪問方式:
int birthstones = Calendar.Months;

二. readonly

1. 使用

readonly關(guān)鍵字是一個可在三個上下文中使用的修飾符:

(1)在字段申明中,readonly可以在字段聲明和構(gòu)造函數(shù)中多次分配、重新分配。構(gòu)造函數(shù)退出后,不能分配 readonly 字段。
其中readonly在值類型和引用類型具有不同的含義:

  • 由于值類型直接包含數(shù)據(jù),因此屬于 readonly 值類型的字段不可變。
  • 由于引用類型包含對其數(shù)據(jù)的引用,因此屬于 readonly 引用類型的字段必須始終引用同一對象。 該對象不是不可變的。 readonly 修飾符可防止字段替換為引用類型的其他實例。 但是,修飾符不會阻止通過只讀字段修改字段的實例數(shù)據(jù)。
    (2) readonly struct,readonly 指示 struct 是不可變的。
    (3)ref readonly方法返回中,readonly 修飾符指示該方法返回一個引用,且不允許向該引用寫入內(nèi)容。

2. Readonly struct example

  • struct 定義上的 readonly 修飾符聲明該結(jié)構(gòu)是不可變的 。 struct 的每個實例字段都必須被標記為 readonly,如下例所示:
public readonly struct Point
{
    public double X { get; }
    public double Y { get; }

    public Point(double x, double y) => (X, Y) = (x, y);

    public override string ToString() => $"({X}, {Y})";
}

前面的示例使用只讀自動屬性來聲明其存儲。 該操作指示編譯器為這些屬性創(chuàng)建 readonly 支持字段。 還可以直接聲明 readonly 字段:

public readonly struct Point
{
    public readonly double X;
    public readonly double Y;

    public Point(double x, double y) => (X, Y) = (x, y);

    public override string ToString() => $"({X}, {Y})";
}

3. Ref readonly return example

  • ref return 上的 readonly 修飾符指示返回的引用無法修改。 下面的示例返回了一個對來源的引用。 它使用 readonly 修飾符來指示調(diào)用方無法修改來源:
private static readonly Point origin = new Point(0, 0);
public static ref readonly Point Origin => ref origin;

所返回的類型不需要為 readonly struct。 ref 能返回的任何類型都能由 ref readonly 返回。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,179評論 2 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,688評論 1 32
  • 類是一個重要的C#編程概念,它在一個單元內(nèi)定義了表示和行為。類提供了面向?qū)ο缶幊毯兔嫦蚪M件編程所需的語言支持,是創(chuàng)...
    CarlDonitz閱讀 1,001評論 0 2
  • #1. 類和結(jié)構(gòu) #2. 類2.1 數(shù)據(jù)成員2.2 函數(shù)成員2.3 只讀字段 #3. 匿名類型 #4. 結(jié)構(gòu)4.1...
    MrDecoder閱讀 511評論 0 0
  • 午后,一場淅淅瀝瀝的大雨過后,燦爛的太陽漸漸蹦出來,掛在天空中普照著大地,它很刺眼卻很溫暖。下午2點30分,又到了...
    桐Tung_c540閱讀 960評論 0 0

友情鏈接更多精彩內(nèi)容