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