《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)...
概念
- 編譯時
編譯時顧名思義就是正在編譯的時候。那啥叫編譯呢?就是編譯器幫你把源代碼翻譯成機(jī)器能識別的代碼。(當(dāng)然只是一般意義上這么說,實際上可能只是翻譯成某個中間狀態(tài)的語言。比如Java只有JVM識別的字節(jié)碼,C#中只有CLR能識別的MSIL。另外還有鏈接器、匯編器。為了了便于理解我們可以統(tǒng)稱為編譯器)
那編譯時就是簡單的作一些翻譯工作,比如檢查你有沒有粗心寫錯啥關(guān)鍵字了啊。有啥詞法分析,語法分析之類的過程。就像個老師檢查學(xué)生的作文中有沒有錯別字和病句一樣。如果發(fā)現(xiàn)啥錯誤編譯器就告訴你。如果你用微軟的VS的話,點下build。那就開始編譯,如果下面有errors或者warning信息,那都是編譯器檢查出來的。所謂這時的錯誤就叫編譯時錯誤,這個過程中做的啥類型檢查也就叫編譯時類型檢查,或靜態(tài)類型檢查(所謂靜態(tài)就是沒把代碼放內(nèi)存中運(yùn)行起來,而只是把代碼當(dāng)作文本來掃描下)。
- 運(yùn)行時
所謂運(yùn)行時就是代碼跑起來了。被裝載到內(nèi)存中去了。(你的代碼保存在磁盤上沒裝入內(nèi)存之前是個死家伙。只有跑到內(nèi)存中才變成活的)。而運(yùn)行時類型檢查就與前面講的編譯時類型檢查(或者靜態(tài)類型檢查)不一樣。不是簡單的掃描代碼。而是在內(nèi)存中做些操作,做些判斷。
代碼??
為了更加直觀的理解編譯時和運(yùn)行時的區(qū)別,我們看以下代碼:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 mm a = new mm(); 6 7 nn b = new nn();//實例化一個nn的對象b 8 9 mm c = b; //把mm的對象c指向b 10 11 Console.WriteLine("非虛方法"); 12 13 a.F(); 14 b.F(); 15 c.F(); 16 17 Console.WriteLine("虛方法"); 18 a.G(); 19 b.G(); 20 c.G(); 21 Console.ReadKey(); 22 } 23 } 24 class mm 25 { 26 public void F() 27 { 28 Console.WriteLine("mm.F()"); 29 } 30 31 public virtual void G() //聲明了一個虛方法 32 { 33 Console.WriteLine("mm.G()"); 34 } 35 } 36 class nn : mm 37 { 38 new public void F() //隱藏了父類的F方法 39 { 40 Console.WriteLine("nn.F()"); 41 } 42 43 public override void G() //重寫了方法G 44 { 45 Console.WriteLine("nn.G()"); 46 } 47 }運(yùn)行結(jié)果截圖如下:
對象a,b沒有問題,但對象c的編譯時類型為mm,那是因為對象a,b,c都是引用類型,運(yùn)行時類型=編譯時類型,但對于虛方法來說,調(diào)用哪個方法取決于該實例運(yùn)行時的類型。
總結(jié)
?2.用運(yùn)行時常量(readonly)而不是編譯時常量(const)
?? ?運(yùn)行時常量(readonly)
?? ??? ?不能聲明在方法中
?? ??? ?使用更靈活,便于后期維護(hù)
?? ??? ?運(yùn)行時求值
?? ??? ?能使用任意類型
?? ??? ?二進(jìn)制層次兼容
?? ?編譯時常量(const)
?? ??? ?可聲明在方法中
?? ??? ?性能優(yōu)于readonly
?? ??? ?值在目標(biāo)代碼中替換
?? ??? ?僅能用于基本類型(內(nèi)建的整數(shù)和浮點類型)、枚舉或字符串
?? ??? ?二進(jìn)制層次不兼容
?? ??? ?在編譯時必須得到確定數(shù)值(或永遠(yuǎn)都不會改變)時使用,例如attribute的參數(shù)和枚舉的定義等
轉(zhuǎn)載于:https://www.cnblogs.com/hekuerle/p/6773298.html
總結(jié)
以上是生活随笔為你收集整理的《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实变函数与计算机有关系吗,实变函数论文.
- 下一篇: C#判断字符串是否为数字字符串