C#中readonly的理解與使用const 與static和Cache


  1. Static只初始化一次,無論多少用戶訪問,在內存中只有一份
  2.  readonly每個線程初始化一次
  3. 一、背景
    小伙伴們在使用C#開發程序時,可能會遇到readonly關鍵字,那么它有什么用呢?
    二、解釋
    通常用在類中屬性前面
    使用了readonly的屬性,只能在定義時,或者構造函數中初始化,其他的地方都不能再修改其值

  4. 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

     

  5. 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;
        }
    }

     

  6. 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();

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM