C# 静态只读字段在内存中是否只有一个副本?

C# 静态只读字段在内存中是否只有一个副本?,c#,syntax,static,field,readonly,C#,Syntax,Static,Field,Readonly,无论存在多少封装类型的对象,静态只读字段在内存中是否只有一个副本 例如: class A{ static readonly SomeType foo; static A(){ foo = new SomeType(); } ... 那么,在整个程序中,foo是否只存在一次,无论有多少个A实例?来自(我的重点) I.8.4.3静态场和静态方法 类型 可以 声明与类型关联的位置,而不是与的任何特定值关联的位置 类型。这些地点是 静态场 是那种类型的。因此,静态字段声明一个 由该

无论存在多少封装类型的对象,静态只读字段在内存中是否只有一个副本

例如:

class A{
  static readonly SomeType foo;
  static A(){
    foo = new SomeType();
  }
...
那么,在整个程序中,
foo
是否只存在一次,无论有多少个
A
实例?

来自(我的重点)

I.8.4.3静态场和静态方法

类型 可以 声明与类型关联的位置,而不是与的任何特定值关联的位置 类型。这些地点是 静态场 是那种类型的。因此,静态字段声明一个 由该类型的所有值共享。与非静态(实例)字段一样,静态字段也是类型化和 那种类型永远不会改变。静态字段始终限于单个应用程序域 (见§) I.12.5 ),但它们也可以按每个线程进行分配

允许在每个线程的基础上进行静态分配

在大多数情况下,代码段中只有一个由
foo
引用的
SomeType
实例

如果您涉及多个应用程序域,或者使用
[ThreadStatic]
对其进行修饰,则可能存在多个实例。

来自(我的重点)

I.8.4.3静态场和静态方法

类型 可以 声明与类型关联的位置,而不是与的任何特定值关联的位置 类型。这些地点是 静态场 是那种类型的。因此,静态字段声明一个 由该类型的所有值共享。与非静态(实例)字段一样,静态字段也是类型化和 那种类型永远不会改变。静态字段始终限于单个应用程序域 (见§) I.12.5 ),但它们也可以按每个线程进行分配

允许在每个线程的基础上进行静态分配

在大多数情况下,代码段中只有一个由
foo
引用的
SomeType
实例


如果您涉及多个应用程序域,或者用
[ThreadStatic]
装饰它,那么可能存在多个实例。

因此,为了确保所有值都共享它,这意味着它是相同的,并且只创建一次?是的,
A
的所有值都共享它。你在创建一个单例吗?我想它是一个单例。是的,我需要这个字段在程序中只创建一次。如果你使用类似于
static readonly Lazy foo=new Lazy(()=>new SomeType())
,那么以后访问
foo.Value
,你甚至不需要那里的静态构造函数。仅限NET4+。因此,为了确保它被所有值共享,这意味着它是相同的,并且只创建了一次?是的,它被
A
的所有值共享。你在创建一个单例吗?我想它是一个单例。是的,我需要这个字段在程序中只创建一次。如果你使用类似于
static readonly Lazy foo=new Lazy(()=>new SomeType())
,那么以后访问
foo.Value
,你甚至不需要那里的静态构造函数。净4+。@oɔɳɹ,@oɔɳɹ,