- Static只初始化一次,無論多少用戶訪問,在內存中只有一份。
- readonly每個線程初始化一次
-
一、背景
小伙伴們在使用C#開發程序時,可能會遇到readonly關鍵字,那么它有什么用呢?
二、解釋
通常用在類中屬性前面
使用了readonly的屬性,只能在定義時,或者構造函數中初始化,其他的地方都不能再修改其值 -
class Age { //年紀添加了 readonly修飾符 //1.可以在定義時對其賦值,一旦賦值就不可以再在他出賦值 readonly int year=20; //2.在構造函數中賦值 Age(int year) { this.year = year; } //3.但是不能在其他地方賦值 void ChangeYear() { year = 1967; // 如果這里賦值了,會出現編譯錯誤 } } ———————————————— 版權聲明:本文為CSDN博主「黑夜の騎士」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/birdfly2015/java/article/details/94609744
-
readonly用於字段百,意思是:字段只能在初始化時候賦值,在隨后的使用中,度字段的值不能再改變。舉個列子: public class TestReadonly { private int readonly int x; //X是只讀字問段 public TestReadonly() { // 只能在初始化時,對只讀字段賦值 x = 100; } pubilc int GetX() { //這個語句答是錯版誤的,因為x不能被再次賦值,x是只讀的(readonly),而權 // 下面的語句試圖改變x的值。 //x = x +100; //這個語句是正確的,因為語句執行后,x的值沒有變 int x1 = x + 100; return x1; } }
- Const與Readonly的區別 鏈接1 鏈接2
的確,const與static readonly 很像,都是將變量聲明為只讀,且在變量初始化后就不可改寫。 那么,const與static readonly 這兩個修飾符到底區別在什么地方呢?其實,這個牽扯出C#語言中兩種不同的常量類型:靜態常量(compile-time constants)和動態常量(runtime constants)。 這兩者具有不同的特性,錯誤的使用不僅會損失效率,而且還會造成錯誤。 首先先解釋下什么是靜態常量以及什么是動態常量。
靜態常量Const是指編譯器在編譯時候會對常量進行解析,並將常量的值替換成初始化的那個值。 動態常量Static的值則 是在運行的那一刻才獲得的,編譯器編譯期間將其標示為只讀常量,而不用常量的值代替, 這樣動態常量不必在聲明的時候就初始化,而可以延遲到構造函數中初始 化。 const修飾的常量是上述中的第一種,即靜態常量; static readonly則是第二種,即動態常量。那么區別可以通過靜態常量與動態常量的特性來說明: 1)const修飾的常量在聲明的時候必須初始化;static readonly修飾的常量則可以延遲到構造函數初始化 2)const修飾的常量在編譯期間就被解析,即常量值被替換成初始化的值;static readonly修飾的常量則延遲到運行的時候 3) const常量既可以聲明在類中也可以在函數體內,但是static readonly常量只能聲明在類中。
那么最主要的區別就是看是怎么來區分編譯時候和運行那一刻了。
1.const規定了一個變量在它初始化值之后,值不能再改變,也就是只讀。
一個好記的方法就是Static這個翻譯是--》”靜態“,但是他是動態常量;哈哈哈,雷霆嘎巴
靜態不靜(姜文不文,姜武不武)哈哈哈哈哈哈哈,無情哈拉少
Const修飾的要給變量賦值;
static修飾的可以先不賦值;
class MemoryData { //這個const是靜態,要先初始化;以后CaCheSetting就被賦值了 public const string CaCheSetting= "CaCheSetting"; //static是動態常量,可以延遲到構造函數中進行初始化 private static IMemoryCache Cache; //初始化的時候,傳過來看看MemoryCache是否已經初始化,已經初始化直接返回;沒有初始化new一個出來,
//這個應該加個鎖,如果兩個程序同時過來,容易死鎖 public MemoryData(IMemoryCache value) { if (value == null) { Cache = new MemoryCache(new MemoryCacheOptions()); } else Cache = value; } //將數據從Cache中取出來,先跑過來個Key,先看看Cache中對應的key是否有value值,
//沒有的話,insert一筆
//有的話,直接取出來了,用ary接收一下,拿走用了。 public IEnumerable<Data.Db> GetCacheSetting() { var ary = (byte[]) Cache.Get(CaCheSetting); if (ary == null) { ary = (byte[])LoadDataToMemory(); } var s = System.Text.Encoding.UTF8.GetString(ary); var obj = (IEnumerable<Data.Db>)JsonConvert.DeserializeObject(s, typeof(IEnumerable<Data.Db>)); return obj; } //加載數據填充到Cache中 public byte[] LoadDataToMemory() { using (var db = new Data.ACC_MINIEHUBEntities()) { var q = db.Table.ToList(); var ary = ConvertToByteAry(q);
//這一步是Set存數據,Setting是Key,從數據庫中取出來的數據q是Value,就像方法名,加載數據到Cache中 Cache.Set(CaCheSettimg, ary); return ary; } } private byte[] ConvertToByteAry(object obj) { var j = JsonConvert.SerializeObject(obj); var ary = System.Text.Encoding.UTF8.GetBytes(j); return ary; } }
//Cache設定 ,下面這個可以直接linq,是因為這個GetCache的方法的返回類型是IEnumerable
var redis = new Cache.MemoryData(null);
var HubSettings = redis.GetCacheSetting().Select(l => new
{
Name= l.name,
Age= l.age
}).Where(l => l.name == "Tom").ToList();