一、   static 多对象共享一段空间,或者说没有对象概念,就是类的概念,不需要实例化,自动被创建。多用于长期共享。不会为对象的创建或销毁而消失。

  public class C
{ static A a = new A("C 创建A",) public A Ci
{
get
{
return a;
} } public C(A b)
{
a = b;
Console.WriteLine("构造" + a.Presentation);
} //public static void Set()
//{
// a = new A("", 11);
//} } public class A
{
private string _presentation;
private int _intvalue = -; public int A1
{
get
{
return _intvalue;
}
} public string Presentation
{
get
{
return _presentation;
}
} public A(string presentation, int intvalue)
{
_presentation = presentation;
_intvalue = intvalue;
Console.WriteLine("构造A类" + presentation + "," + intvalue);
}
}

以上代码有几点说明
1.在C类创建静态A时,虽然在字段中(实建C类会自动创建一个静态构造方法,它会把类中声明的字段初始化值全放在你定义的前面,也就是后面的值可以随时改变字  段的定义的值)

2.Static A类也就是上面a,可以随时被定义成别的对象

3.Static 是什么?就是在单个进程中仅仅保留一份。而它又可以随时被读写。

 static void Main(string[] args)
{
A a1 = new A("a1", );
A a2 = new A("a2", );
C c1 = new C(a1);
C c2 = new C(a2);
Console.WriteLine(object.ReferenceEquals(c1.Ci, c2.Ci)); Console.ReadKey(); }

二、readonly人们常常与const相比,我不解释值类型readonly的问题,只说明引用类型readonly,只读,不会被改变,最直接了解。

 public class C
{ readonly A a = new A("",); public A Ci
{
get
{
return a;
}
//set
//{
// a = value;//别试图在类内部使用时改变它的引用
//} } public C(A b)
{
a = b;//仅仅是在构方法内被初始化
Console.WriteLine("构造" + a.Presentation);
} //public static void Set()
//{
// a = new A("改变", 10000);
//}
}

说明:
1.readonly仅仅可以在构造方法中初始化(字段中一样)

2.readonly不可能在静态构造方法中初始化

3.在类中的任何地方,都无法改变readonly的值(无论是值类型,还是引用类型)

4.为了保证类内部中被调用的稳定性,不会被改变,readonly吧!

5.在不同类中有不同的readonly指向不同地址。也就是多类中保留多份

然而,第三点是有条件的它不能是IEnumerable(最后说明这一点)

 public class B
{
readonly IList<A> geta = new List<A>();
public IList<A> GetA
{
get { return geta; } } public int B1
{
get;
set;
} public B()
{
GetA.Add(new A("B内部创建", ));
Console.WriteLine(geta[].Presentation);
}
}
static void Main(string[] args)
{
A a1 = new A("a1", );
A a2 = new A("a2", );
B b = new B();
b.GetA[] = a1;
Console.WriteLine(b.GetA[].Presentation);
Console.ReadKey(); }

被改变了,readonly面对IEnumerable时,一,虽然IList只读,同样会被改变,二、可以从外面很容易通过属性方法改变Ilist所引用的地址。虽然我给A类重载了
Equals和GetHashCode,可依然改变了,看来IEnumerable.add不会判断这个。(这点我希望能给我指正原理性问题)

  (今天修改一下我的这个内容,readonly锁定的是IEnumerable,不是内部元素,也就是锁定的是IEnumerable本身地址不会改变)

三、static readonly 根据上面的定义,做了以下假设,

1,肯定需要构造方法中定义(静态的,还是默认的?)

2 .进程中保留一份还是多份,?

3。在类中可以改变吗?

  public class C
{ static readonly A a = new A("A1",); public A Ci
{
get
{
return a;
}
//set
//{
// a = value;//别试图在类内部使用时改变它的引用
//}
} public C()
{
// a = new A("A3", 333); 也不可以这里定义
Console.WriteLine("构造C类" + a.Presentation);
}
static C()
{
a = new A("A2", );
Console.WriteLine("构造C静态类" + a.Presentation);
} //public static void Set()
//{
// a = new A("改变", 10000);//也不可以这里改变
//}
}
static void Main(string[] args)
{
A a1 = new A("a1", );
A a2 = new A("a2", );
C c1 = new C();
C c2 = new C();
Console.WriteLine(object.ReferenceEquals(c1.Ci, c2.Ci)); Console.ReadKey(); }

上面的结果

构造A类a1,11
构造A类a2,12
构造A类A1,1111
构造A类A2,2222
构造C静态类A2
构造C类A2
构造C类A2
True

说明:

1.如果一个静态构造方法与一个构造方法同时存在,首先静态构造方法执行,然后是构造方法

2在任何一个构造方法中都会把字段的值重新被定义。

以上是任一本原理书都可以找到的重点是回答上面问题

1.只有静态构造方法可以初始化static readonly

2.进程中仅保留一份

3.类中不可以改原有的值。

想想我们的单例为什么那样创建(上一篇说过http://www.cnblogs.com/shouhongxiao/p/3530091.html),我们单例就是想在一个进程中只保留一份,且不会被已经进入类中多线程改变已经创建的对象,当然是双重锁定了

 if (null == instance)
{
lock (threadSafeLocker)
{
if (null == instance)
{
instance = new VFactory; }
}
}

第一个null = instance 解决效率问题(如果多线程进入对象被创建,就不需lock了)
第二个就是防止已经进入多线程改变

第三个肯定是一个单线程进入了(判断对象是否被创建)

那我们就创建了一份且只有一份,而且不会被进入的多线程改变的单例。

总结一下:static 是为了保证共性(多对象共享,一损具损),readonly是了了保持个性(每个单一对象有自己固定的特性),static readonly ?这世界上仅有我一个,有个性的我。

  

static 还是readonly 还是static readonly的更多相关文章

  1. 读书笔记:const和readonly、static readonly 那些事

    C#中表示不变的量(常量)的两种形式:const 和readonly const 是静态常量 readonly 是动态常量 严格的来讲:const 应该称为常量 而readonly 则应称为只读变量. ...

  2. const,readonly,static

    1.const 表示的是常量(constant),始终不会发生改变,在编译时就确定了.所以类中定义一个常量可以被类访问也可以被类的实例访问.定义时就不能和static一起用.如果用了也是没有作用的,所 ...

  3. C# 总结const、 readonly、 static三者区别:

    总结const. readonly. static三者区别: (有人问我,看似简单,我也没能立刻回答出来,总结一下,分享一下.) const:静态常量,也称编译时常量(compile-time con ...

  4. c#中常量、ReadOnly和Static ReadOnly的差异

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://www.arungudelli.com/tutorial ...

  5. 总结const、readonly、static三者的区别【收藏、转载】20190614

    总结const.readonly.static三者的区别 const:静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享! a.叫编 ...

  6. 【Unity|C#】基础篇(6)——const、readonly、static readonly

    [学习资料] <C#图解教程>(第6章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...

  7. 如何在 C# 中使用 const,readonly,static

    平时在开发时经常会用到 const,readonly,static 关键字,可以肯定这些关键词是完全不同的概念,但有时候他们在用法上很相似以至于在场景中不知道选择哪一个,这篇文章我们就来讨论 C# 中 ...

  8. 比较const ,readonly, stitac readonly

    比较const ,readonly, stitac readonly: const和readonly的值一旦初始化则都不再可以改写: const必须在声明时初始化:readonly既可以在声明时初始化 ...

  9. Database 'xxx' cannot be upgraded because it is read-only or has read-only file Make the database or files writeable, and rerun recovery.

      在分离数据库DatabaseName(暂且用DatabaseName代替该数据库名)后,我将其数据文件以及日志文件移动到新增的磁盘上.然后附加该数据库,结果报如下错误: Database 'Dat ...

  10. C++中的static数据成员与static成员函数

    本文要点: 1.static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联! aka:每个static数据成 ...

随机推荐

  1. 页面中的平滑滚动——smooth-scroll.js的使用

    正常的本页面锚链接跳转的时候跟PPT似的,特别生硬,用户体验非常差. 这时候我们就可以借助smooth-scroll.js这个插件,来实现本页面的平滑的跳转. 1首先,导入必须的JS文件 <sc ...

  2. 乐视开放平台技术架构-servlet和spring mvc篇

    在乐视风口浪尖的时候,敢于站出来说我是乐视的而不怕被打脸的,也就是我了.就算我以后不在乐视了,提起来在乐视工作过,我也还是挺骄傲的.因为这是一个有理想,敢拼敢干的公司.想起复仇者联盟里Fury指挥官的 ...

  3. 网络数据传输安全及SSH与HTTPS工作原理

    本节内容 网络数据传输安全概述 数据加密算法分类 SSH工作原理 HTTPS工作原理 参考资料 个人一直在努力推动git在公司内部的普及和使用,前些日子在公司内部做了一次分享课,给大家介绍了下项目发布 ...

  4. 用require.js封装原生js轮播图

    index.html页面: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...

  5. 【Python3之面向对象的程序设计】

    一.面向对象的程序设计的由来 1.第一阶段:面向机器,1940年以前 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据. 简单来说,就是直接编写 0 和 1 ...

  6. EF Core学习Code First

    下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库. 本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以 ...

  7. An express train to reveries

    An express train to reveries time limit per test 1 second memory limit per test 256 megabytes input  ...

  8. python selenium-webdriver 通过cookie登陆(十一)

    上节介绍了浏览器的常用方法,涉及到了cookie的使用,本节介绍一下如何利用cookie进行登陆系统,这里使用到了request模块,我们首先利用request模块,请求登陆地址进行登陆,登陆成功以后 ...

  9. java中常用的并发工具类

    · 1. 等待多线程完成的CountDownLatch 构造函数接收一个int类型的参数作为计数器,如果想等待N个点,就传入N.当调用CountDownLatch的countDown方法时,N就会减一 ...

  10. 枚举:enum——初写

    入门的时候,针对某一字段状态的判断,一开始是在前端用if else 判断,有一些弊端:①把内置的code暴露给用户②if else最好不要超过3层③前端很长一段冗余判断不规范后改进使用枚举,在后台进行 ...