《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)...
概念
- 編譯時
編譯時顧名思義就是正在編譯的時候。那啥叫編譯呢?就是編譯器幫你把源代碼翻譯成機器能識別的代碼。(當然只是一般意義上這么說,實際上可能只是翻譯成某個中間狀態的語言。比如Java只有JVM識別的字節碼,C#中只有CLR能識別的MSIL。另外還有鏈接器、匯編器。為了了便于理解我們可以統稱為編譯器)
那編譯時就是簡單的作一些翻譯工作,比如檢查你有沒有粗心寫錯啥關鍵字了啊。有啥詞法分析,語法分析之類的過程。就像個老師檢查學生的作文中有沒有錯別字和病句一樣。如果發現啥錯誤編譯器就告訴你。如果你用微軟的VS的話,點下build。那就開始編譯,如果下面有errors或者warning信息,那都是編譯器檢查出來的。所謂這時的錯誤就叫編譯時錯誤,這個過程中做的啥類型檢查也就叫編譯時類型檢查,或靜態類型檢查(所謂靜態就是沒把代碼放內存中運行起來,而只是把代碼當作文本來掃描下)。
- 運行時
所謂運行時就是代碼跑起來了。被裝載到內存中去了。(你的代碼保存在磁盤上沒裝入內存之前是個死家伙。只有跑到內存中才變成活的)。而運行時類型檢查就與前面講的編譯時類型檢查(或者靜態類型檢查)不一樣。不是簡單的掃描代碼。而是在內存中做些操作,做些判斷。
代碼??
為了更加直觀的理解編譯時和運行時的區別,我們看以下代碼:
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 }運行結果截圖如下:
對象a,b沒有問題,但對象c的編譯時類型為mm,那是因為對象a,b,c都是引用類型,運行時類型=編譯時類型,但對于虛方法來說,調用哪個方法取決于該實例運行時的類型。
總結
?2.用運行時常量(readonly)而不是編譯時常量(const)
?? ?運行時常量(readonly)
?? ??? ?不能聲明在方法中
?? ??? ?使用更靈活,便于后期維護
?? ??? ?運行時求值
?? ??? ?能使用任意類型
?? ??? ?二進制層次兼容
?? ?編譯時常量(const)
?? ??? ?可聲明在方法中
?? ??? ?性能優于readonly
?? ??? ?值在目標代碼中替換
?? ??? ?僅能用于基本類型(內建的整數和浮點類型)、枚舉或字符串
?? ??? ?二進制層次不兼容
?? ??? ?在編譯時必須得到確定數值(或永遠都不會改變)時使用,例如attribute的參數和枚舉的定義等
轉載于:https://www.cnblogs.com/hekuerle/p/6773298.html
總結
以上是生活随笔為你收集整理的《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实变函数与计算机有关系吗,实变函数论文.
- 下一篇: C#判断字符串是否为数字字符串