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

引言

有那麼幾天沒更新博客了,發現到了不起不寫的地步,老是有那麼個聲音在強迫本身,雖然工做很累,可是有些東西不寫出來,不能原諒本身。今天爲何總結這兩個關鍵字的區別,總以爲這兩個關鍵字的用法用的太習慣了,沒想過爲何這麼用,就比如爲何一直用右手拿筷子,這麼習慣。爲何我要用右手拿筷子,爲何不用左手呢?忽然你就這麼幹了,發現你和周邊很不協調,並且還夾不了菜。const和readonly也同樣,習慣了,一直這樣用,也就沒追究過。忽然被那麼一問,還真說不出來個一二,今天就細細的研究下,到底這東東是啥玩意兒?網上雖然不少這方面的內容,雖然也看過,可是那畢竟是別人總結的,本身沒動手實踐一下,就以爲那不是本身的。實踐才能記得更深入,理解的更深。面試

常量

靜態常量:指編譯器在編譯時會對常量進行解析,並將常量的值替換成初始化的那個值。shell

動態常量:在運行的那一刻獲取值,編譯器編譯期間將其標識爲只讀常量,而不用常量的值代替,這樣動態常量沒必要在聲明的時候就初始化,而能夠延遲到構造函數中初始化。函數

readonly和const

const修飾的常量爲靜態常量,而readonly修飾的常量爲動態常量。spa

如何區別呢?.net

const修飾的常量在聲明的時候必須初始化,readonly修飾的常量則能夠延遲到構造函數中初始化。code

const修飾的常量在編譯期間就被解析,即常量值被替換成初始化的值,readonly修飾的常量則延遲到運行的時候。blog

const修飾的常量注重的是效率,readonly修飾的常量注重靈活。內存

const修飾的常量沒有內存的消耗,readonly由於須要保存常量,因此有內存消耗。字符串

const只能修飾基元類型。枚舉類或者字符串類型,readonly卻沒有這個限制。get

題一:

 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一探究竟的話,仍是收穫頗深的,若是對你有所幫助不妨推薦一下。謝謝!

參考文章:http://blog.csdn.net/shellching/article/details/8516789

相關文章
相關標籤/搜索