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

  • 常量像靜態(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 的每個實例字段都必須被標(biāo)記為 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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市收奔,隨后出現(xiàn)的幾起案子掌呜,更是在濱河造成了極大的恐慌坪哄,老刑警劉巖势篡,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異禁悠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兑宇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隶糕,“玉大人,你說我怎么就攤上這事若厚±褂ⅲ” “怎么了测秸?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霎冯。 經(jīng)常有香客問我,道長沈撞,這世上最難降的妖魔是什么慷荔? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任显晶,我火速辦了婚禮,結(jié)果婚禮上壹士,老公的妹妹穿的比我還像新娘磷雇。我一直安慰自己,他們只是感情好躏救,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布唯笙。 她就那樣靜靜地躺著,像睡著了一般盒使。 火紅的嫁衣襯著肌膚如雪崩掘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天少办,我揣著相機(jī)與錄音苞慢,去河邊找鬼。 笑死凡泣,一個胖子當(dāng)著我的面吹牛枉疼,可吹牛的內(nèi)容都是我干的皮假。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼骂维,長吁一口氣:“原來是場噩夢啊……” “哼惹资!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起航闺,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤褪测,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后潦刃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侮措,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年乖杠,在試婚紗的時候發(fā)現(xiàn)自己被綠了分扎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡胧洒,死狀恐怖畏吓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卫漫,我是刑警寧澤菲饼,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站列赎,受9級特大地震影響宏悦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜包吝,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一饼煞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诗越,春花似錦派哲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽储矩。三九已至感耙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間持隧,已是汗流浹背即硼。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留屡拨,地道東北人只酥。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像裂允,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绝编,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

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