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