程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [c#基礎]關於const和readonly常見的筆試題剖析

[c#基礎]關於const和readonly常見的筆試題剖析

編輯:C#入門知識

有那麼幾天沒更新博客了,發現到了不得不寫的地步,總是有那麼個聲音在強迫自己,雖然工作很累,但是有些東西不寫出來,不能原諒自己。今天為什麼總結這兩個關鍵字的區別,總覺得這兩個關鍵字的用法用的太習慣了,沒想過為什麼這麼用,就好比為什麼一直用右手拿筷子,這麼習慣。為什麼我要用右手拿筷子,為什麼不用左手呢?突然你就這麼干了,發現你和周邊很不協調,而且還夾不了菜。const和readonly也一樣,習慣了,一直這樣用,也就沒追究過。突然被那麼一問,還真說不出來個一二,今天就細細的研究下,到底這東東是啥玩意兒?網上雖然很多這方面的內容,雖然也看過,但是那畢竟是別人總結的,自己沒動手實踐一下,就覺得那不是自己的。實踐才能記得更深刻,理解的更深。   常量 靜態常量:指編譯器在編譯時會對常量進行解析,並將常量的值替換成初始化的那個值。   動態常量:在運行的那一刻獲取值,編譯器編譯期間將其標識為只讀常量,而不用常量的值代替,這樣動態常量不必在聲明的時候就初始化,而可以延遲到構造函數中初始化。   readonly和const const修飾的常量為靜態常量,而readonly修飾的常量為動態常量。   如何區別呢?   const修飾的常量在聲明的時候必須初始化,readonly修飾的常量則可以延遲到構造函數中初始化。   const修飾的常量在編譯期間就被解析,即常量值被替換成初始化的值,readonly修飾的常量則延遲到運行的時候。   const修飾的常量注重的是效率,readonly修飾的常量注重靈活。   const修飾的常量沒有內存的消耗,readonly因為需要保存常量,所以有內存消耗。   const只能修飾基元類型。枚舉類或者字符串類型,readonly卻沒有這個限制。   題一:   復制代碼  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Threading.Tasks;  6   7 namespace Wolfy.ConstReadonly  8 {  9     class Program 10     { 11         static readonly int A = 2 * B; 12         static readonly int B = 4; 13         static void Main(string[] args) 14         { 15             Console.WriteLine("A={0},B={1}", A, B); 16             Console.Read(); 17         } 18     } 19 } 復制代碼 那麼A=?,B=?,知道的先忍著,看一下到底是多少:     為什麼會這樣呢?ILspy看一下,到底是咋回事?       通過這也看不到什麼不同啊,不要急,慢慢來,對比一下就知道不同了。   說明一下靜態只構字段:       改為下面的就可以了:   復制代碼  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Threading.Tasks;  6   7 namespace Wolfy.ConstReadonly  8 {  9     class Person 10     { 11         public static readonly int C; 12          static Person() 13         { 14             C = 3; 15         } 16     } 17 } 復制代碼 寫這個主要是為了說明上面圖中紅色字描述的靜態只構字段。   那麼我們把readonly改為const試一試。   題二:       這個題,主要是考察static能不能和const關鍵字同時修飾一個變量,編譯發現報錯。   題三:   復制代碼  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Threading.Tasks;  6   7 namespace Wolfy.ConstReadonly  8 {  9     class Program 10     { 11         const int A = 2 * B; 12         const int B = 4; 13         static void Main(string[] args) 14         { 15             Console.WriteLine("A={0},B={1}", A, B); 16             Console.Read(); 17         } 18     } 19 } 復制代碼 那麼A=?,B=?,知道的,也別急,先忍著,看一下到底是多少:       那麼這個面試題的IL是什麼樣子的呢?這裡為了方便對比,將readonly的IL部分貼到一起,方便對比。   const修飾的常量在編譯期間就被解析,即常量值被替換成初始化的值,readonly修飾的常量則延遲到運行的時候。       通過IL的對比,對他們的區別有了更深的認識了吧。希望對你有所幫助。   題四:       這個考察的主要是const修飾的常量必須初始化。   總結 東西很基礎,只是想研究個究竟的時候,通過IL看了一下,雖然基礎,如果通過IL一探究竟的話,還是收獲頗深的,如果對你有所幫助不妨推薦一下。謝謝!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved