c#.net中const和readonly的區(qū)別
(2) 初始化賦值不同。
const修飾的常量必須在聲明的同時(shí)賦值。例如:
public class Class1
{
public const int MaxValue = 10; //正確聲明
public const MInValue; //錯(cuò)誤:常量字段要求提供一個(gè)值
public Class1()
{
MinValue = 10;
}
}
readonly字段可以在初始化(聲明或構(gòu)造函數(shù))的過程中賦值。因此,根據(jù)所使用的構(gòu)造函數(shù),readonly字段可能具有不同的值。
public class Class1
{
public readonly int c = 10; //正確聲明
public readonly int z;
public Class1()
{
z = 24;//正確
}
protected void Load()
{
z = 24;//錯(cuò)誤:無法對(duì)只讀的字段賦值(構(gòu)造函數(shù)或變量初始值指定項(xiàng)中除外)
}
}
readonly是實(shí)例成員,所以不同的實(shí)例可以有不同的常量值,這是readonly更靈活。
public readonly Color Red = new Color(255, 0, 0);
public readonly Color Green = new Color(0, 255, 0);
public readonly Color Blue = new Color(0, 0, 255);
(3) const字段是編譯時(shí)常數(shù),而readonly字段可用于運(yùn)行時(shí)常數(shù)。
const要求編譯器能夠在編譯時(shí)計(jì)算出確定的值。在編譯的時(shí)候,用計(jì)算出的這個(gè)確定的值去替換調(diào)用該常量的每一個(gè)地方。因此不能從一個(gè)變量中提取值來初始化常量。
readonly允許把一個(gè)字段設(shè)置成常量,但可以執(zhí)行一些運(yùn)算,可以確定它的初始值。因?yàn)閞eadonly是在計(jì)算時(shí)執(zhí)行的,所以可以用某些變量初始化。在運(yùn)行時(shí)才確定的該值。
(4) const默認(rèn)就是靜態(tài)的,而readonly如果設(shè)置成靜態(tài)的就必須顯示聲明。
(5) const修飾的值的類型也有限制,它只能為下列類型之一(或能夠轉(zhuǎn)換為下列類型):sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、enum類型或引用類型。注意能夠聲明為const的引用類型只能為string或值為null的其他引用類型。readonly可以是任何類型。
這就是說,當(dāng)我們需要一個(gè)const的常量時(shí),若他的類型限制了它不能再編譯時(shí)被計(jì)算出確定的值來,那么我們可采取將之聲明為static readonly的方式來解決。但兩者之間還是有一點(diǎn)細(xì)微的差別的??聪旅鎯蓚€(gè)不同的文件。
file1.cs
using System;
namespace MyNamespace1
{
public class MyClass1
{
public static readonly int myField = 10;
}
}
file2.cs
namespace MyNamespace2
{
public class MyClass1
{
public static void Main()
{
Console.WriteLine(MyNamespace1.MyClass1.myField);
}
}
}
兩個(gè)類分屬于兩個(gè)文件file1.cs和file2.cs,并分開編譯。在文件file1.cs內(nèi)的域myField聲明為static readonly時(shí),如果我們由于某種需要將myField的值改為了20,那么我們只需要重新編譯文件file1.cs為file1.dll,在執(zhí)行file2.exe時(shí)即會(huì)得到20。
但如果將static readonly改變?yōu)閏onst后,再改變myField的初始化值時(shí),我們則必須重新編譯所有引用到file1.dll的文件,否則我們引用的MyNamespace1.MyClass1.myField將不會(huì)如我們所愿而改變。這在大的系統(tǒng)開發(fā)過程中尤其需要注意。
(6) object、Array(數(shù)組)和struct(結(jié)構(gòu))不能被聲明為const常量。
- C#中const和readonly的用法比較
- 淺談Java中的final關(guān)鍵字與C#中的const, readonly關(guān)鍵字
- C#中const 和 readonly 修飾符的用法詳解
- 淺談c#中const與readonly區(qū)別
- C#中const用法詳解
- 深入探討C#中的const、readonly關(guān)鍵字
- C#基礎(chǔ)知識(shí)系列八const和readonly關(guān)鍵字詳細(xì)介紹
- C++中const的實(shí)現(xiàn)細(xì)節(jié)介紹(C,C#同理)
- C#基礎(chǔ):基于const與readonly的深入研究
- C#中 const 和 readonly 的不同
- C# 中const,readonly,static的使用小結(jié)
相關(guān)文章
.NET?Framework?的項(xiàng)目如何使用?FTP?下載文件
本文專門針對(duì)面向?.NET?Framework?的項(xiàng)目,?對(duì)于面向?.NET?6?及更高版本的項(xiàng)目,不再支持?FTP,此示例演示如何從?FTP?服務(wù)器下載文件,感興趣的朋友跟隨小編一起看看吧2024-01-01
ASP.NET簡(jiǎn)化編輯界面解決思路及實(shí)現(xiàn)代碼(2)
這篇與前一篇改進(jìn)部分,也許大家會(huì)留意到動(dòng)畫演示,主要是GridVeiw的更新與刪除會(huì)在每row都有。因此Insus.NET把它抽取出來,放在GridView外,感興趣的朋友可以了解下啊,希望本文對(duì)你有所幫助2013-01-01
WPF關(guān)鍵幀動(dòng)畫介紹與實(shí)現(xiàn)
這篇文章介紹了WPF關(guān)鍵幀動(dòng)畫與實(shí)現(xiàn)方式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
在ASP.NET?MVC下限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)的解決方法
有時(shí)候,當(dāng)用戶請(qǐng)求一個(gè)Controller下的Action,我們希望,在單位時(shí)間間隔內(nèi),比如每秒,每分鐘,每小時(shí),每天,每星期,限制同一個(gè)IP地址對(duì)某個(gè)Action的請(qǐng)求次數(shù),如何做呢?這篇文章主要介紹了在ASP.NET?MVC下限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù),需要的朋友可以參考下2024-01-01
asp.net實(shí)現(xiàn)上傳圖片時(shí)判斷圖片的模式GRB或CMYK的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)上傳圖片時(shí)判斷圖片的模式GRB或CMYK的方法,涉及asp.net針對(duì)圖片的讀取及屬性操作相關(guān)技巧,需要的朋友可以參考下2016-07-07
利用ASP.NET MVC+EasyUI+SqlServer搭建企業(yè)開發(fā)框架
本文主要介紹使用asp.net mvc4、sqlserver、jquery2.0和easyui1.4.5搭建企業(yè)級(jí)開發(fā)框架的過程,希望能夠幫到大家。2016-04-04
ASP.NET中使用開源組件NPOI快速導(dǎo)入導(dǎo)出Execl數(shù)據(jù)
這篇文章主要介紹了ASP.NET中使用開源組件NPOI快速導(dǎo)入導(dǎo)出Execl數(shù)據(jù),NPOI是一個(gè)很強(qiáng)大的Execl操作組件,需要的朋友可以參考下2014-09-09

