最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入探討C#中的const、readonly關(guān)鍵字

 更新時(shí)間:2014年08月15日 09:16:15   投稿:junjie  
這篇文章主要介紹了深入探討C#中的const、readonly關(guān)鍵字,本文可以幫助你深刻理解這兩個(gè)關(guān)鍵字,而且是面試中最可能面試到的問(wèn)題哦,需要的朋友可以參考下

首先不可否認(rèn),這些在面試上會(huì)經(jīng)常被面試官問(wèn)起,但是你回答的讓面試官滿意嗎?當(dāng)然如果你知道了這些原理,或許你就不

怕了。既然說(shuō)到了原理,我們還是從MSDN說(shuō)起。

一:值得推敲的幾個(gè)地方

1.先來(lái)看看msdn上面對(duì)const是怎么說(shuō)的,我們會(huì)看到。不能修改,編譯時(shí)常量這些關(guān)鍵性信息。

Q:  const為什么不能被修改。

A:這個(gè)很簡(jiǎn)單,很多教科書上面都說(shuō),當(dāng)編譯器編譯時(shí),會(huì)將常量的值保存在該程序集的元數(shù)據(jù)中,下面我們做個(gè)實(shí)例

看一看。

①:新建一個(gè)projectA。

復(fù)制代碼 代碼如下:

// ProjectA
public class TestClass
{
     public const int CTRIP = int.MaxValue;
}

再建一個(gè)MainProject,引用下projectA。

復(fù)制代碼 代碼如下:

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(TestClass.CTRIP);

        Console.Read();
    }
}


然后我們把mainproject運(yùn)行起來(lái)。

既然我把mainproject跑起來(lái)了,并且也引用了Test.dll,剛才也說(shuō)了,編譯的時(shí)候會(huì)把常量值保存在程序集的元數(shù)據(jù)中,那我們

就找一找,打開(kāi)ILdasm.exe,并且Ctrl+M。

很可惜,我并沒(méi)有找到Ctrip的符號(hào),也沒(méi)有找到int.MaxValue,也沒(méi)有找到所謂的0x7fffffff,倒是找到了一個(gè)Assembly的一些版本信息的元數(shù)據(jù),那么這時(shí)候你可能會(huì)疑惑了,究竟const的值有沒(méi)有保存到Assembly里面去呢?很簡(jiǎn)單的一個(gè)驗(yàn)證方法就是,把Mainproject下面bin中的Test.dll刪除掉,看看會(huì)有怎么樣的奇跡發(fā)生。

②: 聰明的你應(yīng)該想到了,既然運(yùn)行Demo.exe的時(shí)候不再加載Test.dll,而是直接從Demo的Assembly里面獲取const值,

那是不是會(huì)有斷層的事情發(fā)生,也就是版本不一致的情況,比如我已經(jīng)修改了const值,然后把編譯好的dll拷貝到Mainproject的bin目錄下,直接運(yùn)行Demo.exe,會(huì)不會(huì)出現(xiàn)MainProject讀不到修改后的const值呢?這里我將const改成 int.MinValue。

下面我們可以試試看。

復(fù)制代碼 代碼如下:

// ProjectA
public class TestClass
{
    public const int CTRIP = int.MinValue;
}

    

好了,看到上面的結(jié)果,就進(jìn)一步佐證了剛才的說(shuō)法,const確確實(shí)實(shí)是保存在Assembly的元數(shù)據(jù)中,這里還要順便提示一下,Enum本質(zhì)上是const,所以它也存在我剛才說(shuō)的斷層的問(wèn)題,說(shuō)到這里,我想你對(duì)const的原理應(yīng)該比較熟悉了,現(xiàn)在我們來(lái)看看Question的問(wèn)題。既然是元數(shù)據(jù),那什么是元數(shù)據(jù)?“描述數(shù)據(jù)的數(shù)據(jù)” 叫做元數(shù)據(jù),既然它是基礎(chǔ)的描述性數(shù)據(jù),那么在定義好后是決對(duì)不能改變的,這個(gè)定義時(shí)也就是msdn說(shuō)的編譯時(shí),是不是so easy呢?

Q:  const為什么要做成靜態(tài)的,而不是做成實(shí)例的

A:  其實(shí)通過(guò)對(duì)第一個(gè)Question的分析,很多東西我們應(yīng)該都會(huì)豁然開(kāi)朗,因?yàn)榇嬖跀鄬拥膯?wèn)題,那么最好的方法就是const的值

永遠(yuǎn)也不要變,這樣就可以避免問(wèn)題的發(fā)生,既然是永遠(yuǎn)都不變的東西,當(dāng)然是跟著“類型”走比跟著“實(shí)例”走要好的多,你說(shuō)對(duì)不對(duì),因?yàn)閟tatic是個(gè)小緩存,沒(méi)必要new一下才產(chǎn)生。。。

Q: readonly字段只能在ctor中初始化嗎?

A:這個(gè)問(wèn)題蠻有意思的,我們知道readonly的意思就是只讀字段的意思,我們知道一般的字段具有可讀寫的功能,

先還是看看編譯器怎么說(shuō)。

從編譯器上可以看到,確實(shí)readonly的初始化還可以在“變量初始化”的時(shí)候進(jìn)行初始化,那么這樣說(shuō)Question的答案應(yīng)該就是否定的,但是真的是如此嗎?我們都知道有一個(gè)東西叫做“語(yǔ)法糖”,而且經(jīng)常是編譯器提供給我們用的,所以真正的想看到發(fā)生了什么,只能用ILDasm.exe 穿透編譯器,看看到底發(fā)生了什么。

從IL中可以看到,真的就是編譯器的語(yǔ)法糖,本質(zhì)上都是在ctor中初始化的,所以說(shuō),看問(wèn)題千萬(wàn)不要看表面。

注:Stsfld 用來(lái)自計(jì)算堆棧的值替換靜態(tài)字段的值。

相關(guān)文章

  • C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法

    C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法

    json好久沒(méi)用了,今天在用到j(luò)son的時(shí)候,發(fā)現(xiàn)對(duì)字符串做解析的時(shí)候總是多出雙引號(hào),下面給大家介紹C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法,需要的朋友參考下吧
    2016-03-03
  • C#中尾遞歸的使用、優(yōu)化及編譯器優(yōu)化

    C#中尾遞歸的使用、優(yōu)化及編譯器優(yōu)化

    這篇文章主要介紹了C#中尾遞歸的使用、優(yōu)化及編譯器優(yōu)化,本文講解了遞歸運(yùn)用、尾遞歸優(yōu)化、編譯器優(yōu)化等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • C#調(diào)用WebService的方法步驟

    C#調(diào)用WebService的方法步驟

    在日常工作中,如果涉及到與第三方進(jìn)行接口對(duì)接,有的會(huì)使用WebService的方式,這篇文章主要講解在.NET?Framework中如何調(diào)用WebService,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2025-03-03
  • DevExpress實(shí)現(xiàn)自定義TreeListNode的Tooltip的方法

    DevExpress實(shí)現(xiàn)自定義TreeListNode的Tooltip的方法

    這篇文章主要介紹了DevExpress實(shí)現(xiàn)自定義TreeListNode的Tooltip的方法,需要的朋友可以參考下
    2014-08-08
  • 深入理解C#窗體關(guān)閉事件

    深入理解C#窗體關(guān)閉事件

    很多初學(xué)者都想把默認(rèn)的C#關(guān)閉按鈕事件弄明白,本文就介紹一下C#窗體關(guān)閉事件,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C#中的命名空間詳解(Namespace)

    C#中的命名空間詳解(Namespace)

    文章介紹了命名空間在C#編程中的作用,包括命名空間的定義與使用、using關(guān)鍵字的使用以及嵌套命名空間的實(shí)現(xiàn),通過(guò)這些機(jī)制,開(kāi)發(fā)者可以有效地組織和隔離代碼,避免命名沖突,提高代碼的可讀性和可維護(hù)性
    2024-12-12
  • c#使用資源文件的示例

    c#使用資源文件的示例

    對(duì)于資源文件的使用,說(shuō)白點(diǎn)就是通過(guò)強(qiáng)制類型轉(zhuǎn)換,將資源文件里的數(shù)據(jù)強(qiáng)行的轉(zhuǎn)換成你需要的,換種方式說(shuō),就是你原來(lái)存進(jìn)去什么,就用什么類型拿出來(lái),下面我們學(xué)習(xí)一下c#使用資源文件的方法
    2014-01-01
  • C# Winfom 中ListBox的簡(jiǎn)單用法詳解

    C# Winfom 中ListBox的簡(jiǎn)單用法詳解

    這篇文章主要介紹了C# Winfom 中ListBox的簡(jiǎn)單用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • WPF中TreeView控件的用法

    WPF中TreeView控件的用法

    這篇文章介紹了WPF中TreeView控件的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#使用shell32獲取文件屬性的方法

    C#使用shell32獲取文件屬性的方法

    這篇文章主要介紹了C#使用shell32獲取文件屬性的方法,涉及C#通過(guò)shell32獲取文件屬性的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

龙泉市| 太康县| 银川市| 常宁市| 固原市| 宽甸| 苗栗县| 贺兰县| 广元市| 醴陵市| 大丰市| 许昌县| 钟祥市| 锡林浩特市| 西林县| 昭觉县| 旌德县| 肃北| 布尔津县| 兴化市| 澄城县| 理塘县| 安徽省| 西安市| 西乌| 青岛市| 石景山区| 淮滨县| 托里县| 浙江省| 小金县| 历史| 阜南县| 峨眉山市| 南京市| 筠连县| 灵寿县| 张家港市| 汕头市| 宁波市| 齐河县|