首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么应该尽可能避免静态构造函数初始化静态字段

C#具有一个默认开启的代码分析规则:[CA1810]Initialize reference type static fields inline,推荐我们以内联的方式初始化静态字段,而不是将初始化放在静态构造函数...不同的是Foo以内联(inline)赋值的方法进行初始化,而Bar则将初始化操作定义静态构造函数。...从Foo和Bar的IL代码可以看出,针对它们静态字段的初始化都放在静态构造函数。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义Foo静态构造函数会自动执行,但是定义Bar的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...四、关于“All-Zero”结构体 如果我们一个结构体显式定义了一个静态构造函数,当我们调用其构造函数之前,静态构造函数会自动执行。

15210

为什么 C# 的 string.Empty 是一个静态只读字段,而不是一个常量呢?

进一步可以发现 string.Empty 实际上是一个静态只读字段,而不是一个常量。 为什么这个看起来最适合是常量的 string.Empty,竟然使用静态只读字段呢?...它被 JIT 视为内在的,因此静态构造函数永远不会运行。将它保持为未初始化的状态将会使得调试器难以解释此行为。 于是我们需要调用 String 的构造函数,以便编译器不会将其标记为文字。...string.Empty 字段整个 String 类型你都看不到初始化的代码,String 类的静态构造函数也不会执行。也就是说,String 类的所有静态成员都不会被托管代码初始化。...String 类的构造函数(注意不是静态构造函数,String 类的静态构造函数是特殊处理不会调用的); 而如果这是一个静态字段,那么编译器可以不做特殊处理的情况下,生成 ldsfld string...[mscorlib]System.String::Empty,这在首次执行时会触发 String 类的构造函数,并在本机代码(托管代码)完成初始化。

1K00
您找到你想要的搜索结果了吗?
是的
没有找到

.NET面试题系列 - C# 基础知识(1)

Finalize:GC决定回收这个对象之后,会调用这个方法。如果要做一些额外的例如回收对象的托管属性或对象,应当重写这个方法。只有存在托管对象时才需要这么垃圾回收中会详细介绍。...如果类型对象已经存在,则不会再次调用静态构造函数。 调用类型的实例初始化器,初始化类型的静态成员。 例如下面的代码C#首先将a初始化为5,然后再修改成10。...这两者均位于基础类库mscorlib。 1.6.2 实例构造函数(类型) 类型的实例构造函数不能被继承。它负责将类型的实例字段初始化。对于静态字段,由静态构造函数负责。...程序,用户无法控制何时执行静态构造函数静态构造函数不应该调用基类型的静态构造函数。这是因为类型不可能有静态字段是从基类型分享或继承的。...如果我们不了解堆上的内存分配方式,对静态构造函数的理解会十分困难。为什么创建第一个实例之前?为什么不能直接调用?为什么不能有参数?我们完全无法理解,只能通过死记硬背的方式记住这些性质。

1.8K20

.NET面试题解析(05)-常量、字段、属性、特性与委托

字段与属性有什么异同? 4. 静态成员和静态成员的区别? 5. 自动属性有什么风险? 6. 特性是什么?如何使用? 7. 下面的代码输出什么结果?为什么?...那么问题来了,如果有多个构造函数,就像下面这样,有多半个构造函数,会造成两个构造函数.ctor重复产生对字段赋值的IL代码,这就造成了不必要的代码膨胀。...这个其实也很好解决,默认构造函数后加一个“:this()”就OK了,或者显示的构造函数里初始化字段。...静态成员和静态成员的区别? 静态变量使用 static 修饰符进行声明,静态成员加类的时候就被加载(上一篇中提到过,静态字段是随类型对象存放在Load Heap上的),通过类进行访问。...静态函数的实现里不能使用静态成员,如静态变量、静态函数等。 5. 自动属性有什么风险? 因为自动属性的私有字段是由编译器命名的,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6.

99320

.NET面试题解析(05)-常量、字段、属性、特性与委托

字段与属性有什么异同? 4. 静态成员和静态成员的区别? 5. 自动属性有什么风险? 6. 特性是什么?如何使用? 7. 下面的代码输出什么结果?为什么?...那么问题来了,如果有多个构造函数,就像下面这样,有多半个构造函数,会造成两个构造函数.ctor重复产生对字段赋值的IL代码,这就造成了不必要的代码膨胀。...这个其实也很好解决,默认构造函数后加一个“:this()”就OK了,或者显示的构造函数里初始化字段。...静态成员和静态成员的区别? 静态变量使用 static 修饰符进行声明,静态成员加类的时候就被加载(上一篇中提到过,静态字段是随类型对象存放在Load Heap上的),通过类进行访问。...静态函数的实现里不能使用静态成员,如静态变量、静态函数等。 5. 自动属性有什么风险? 因为自动属性的私有字段是由编译器命名的,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6.

80810

C#基础知识系列六(静态类和静态类成员)

程序不能指定加载静态类的确切时间。 但是,可以保证程序首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。...静态构造函数仅调用一次,程序驻留的应用程序域的生存期内,静态类一直保留在内存。...静态类不能包含实例构造函数,但可以包含静态构造函数。 如果静态类包含需要进行重要的初始化的静态成员,也应定义静态构造函数静态类成员   静态类可以包含静态的方法、字段、属性或事件。 ...虽然字段不能声明为 static const,但 const 字段的行为本质上是静态的。 这样字段属于类型,不属于类型的实例。...C#静态成员是比较敏感的东西,不是十分确认的情况下不要使用; 3:建议更多地使用一般类(静态类)。

80320

C# .NET面试系列二:面向对象

这样可以确保创建派生类对象时,基类的构造函数也得到正确地执行。5. 抽象类和接口有什么区别?...执行顺序:父类的静态构造函数,子类的静态构造函数,父类的静态字段初始化,子类的静态字段初始化,父类的实例构造函数,父类的静态字段初始化,子类的实例构造函数,子类的静态字段初始化,方法调用父类的静态构造函数...父类的实例构造函数:如果创建了父类的实例,执行父类的实例构造函数。实例构造函数用于初始化实例成员,每次创建实例时都会执行。父类的静态字段初始化:执行父类的静态字段初始化。...子类的静态字段初始化:执行子类的静态字段初始化。静态字段按照声明的顺序初始化。方法调用:最后,可以调用类的方法。方法是实例被创建后才能被调用。...C# 中有没有静态构造函数,如果有是做什么用的?是的,C# 存在静态构造函数静态构造函数是类的一种特殊类型的构造函数,用于初始化静态成员和执行一次性的初始化操作。

12010

解析C#构造函数

构造函数设计的作用: c#创建一个引用类型的实例时,首先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步块索引),最后调用类型的实例构造器来设置对象的初始化状态。 3.   ...在这种情况下,用简化语法来初始化的字段虚方法调用之前就已经初始化了。 二.  C#构造函数的分类: 1.   ...3.构造函数使用范围:     (1).无参数的实例构造函数静态构造函数可以同一类同时定义,有参的实例构造函数静态构造函数也可以同一类同时定义。...C#替代构造函数的方式: 1.极少数情况下,可以不调用实例构造器的前提下创建一个类型的实例。...C#构造器的使用情形: 1.静态构造函数的使用:      类中有一些静态字段或属性,需要在第一次使用类之前,从外部源初始化这些静态字段和属性。

3.1K50

C# static

本文,大文豪的static与C#的static随笔基础上修改,增加了几个关键知识点 1、static 关键字简介 static是C#中经常使用的关键字之一,这个关键字常用于方法、字段、属性、事件、构造函数...(2)、内存的初始化 a、静态成员是第一次使用时初始化,静态成员是创建成员的时候厨初始化 b、静态构造函数只能被执行一次;静态构造函数可以根据需要进行多次使用。...(4)、静态类 a、静态可以包含静态成员,但是静态必须全都都是静态成员,不能有静态成员存在 b、静态类无法实例化,所以不能有静态构造函数,但是可以有静态构造函数,给静态成员初始化用。...h、如果没有写静态构造函数,而类包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。 i、静态构造函数不能有静态成员,因为 ?...,而是属于这个类的对象,所以没有实例化对象之前,是找不到静态成员的,所以静态方法或者构造函数中使用静态成员必须这样:new 类名().静态成员=值; j、静态构造函数是最早被调用的,只要有静态访问

83950

C# 学习笔记(3)—— 类和结构体

根据面向对象语言的封装思想,字段最好设为 private,因为这样可以防止客户端之间对字段进行篡改,从而保证了内部成员的完整性。...构造函数必须与类同名 构造函数不允许有返回类型 2、静态构造函数 静态构造函数用于初始化类静态成员,创建第一个实例或引用任何静态成员之前,CLR 都将自动调用静态构造函数 public class...,与实例构造函数一样,要成为静态构造函数必须具有以下特点 静态构造函数不能使用任何访问修饰符 静态构造函数不能带有任何参数 静态构造函数只会执行一次 不能直接调用静态构造函数 程序,程序员无法控制执行静态构造函数的时机...析构函数 析构函数用于类销毁之前释放类实例所使用的托管和托管资源。...但若创建了托管资源的对象,应用程序使用完这些托管资源之后,垃圾回收期将运行对象的析构函数来释放这些资源 public class Person { ~Person()

20710

第2章 C#程序设计基础

如果一定要用C#的关键字作为变量名,则应使用“@”作为前缀,但强烈建议不要这样。关键字是对C#编译器具有特殊意义的预定义保留字,如if、for、while等。...简述C#static字段的特点与含义。 static修饰的字段称为静态字段,而其他修饰符修饰的字段称之为实例字段。...静态字段只能通过类来访问,而实例字段只能通过对象来访问。 12. 简述C#this关键字的特点与含义。 this关键字仅限于类的方法和构造函数中使用。...(6)构造函数可分为实例构造函数静态构造函数。...使用static修饰符修饰的构造函数称为静态构造函数,主要用于对类的静态字段进行初始化,其不带有参数,不能被static之外的其它修饰符修饰,也不能被调用;使用static之外的修饰符修饰(通常使用public

1.8K40

dotnet 谨慎静态构造函数里使用锁

的 this 就分别属于不同的两个对象 然而静态构造函数就比较复杂起来的,大家都知道,没有标记线程静态的前提下,所有的静态字段和属性等都是全局共享的,全局共享的就意味着所有的线程都访问到的相同的对象...相当于进入静态构造函数设置了一个锁对象,只有一个线程能进入调用静态构造函数,其他线程只能等待静态构造函数执行完成才能继续 多线程碰到某个类型的静态构造函数时,就和碰到竞态资源一样,也相当于碰到一个锁...如果真的如此关注了,那代码也写不了了,碰到的每一个类型,都需要关注一下的话,这个开发就不好玩了 这就是为什么最佳实践里面推荐不要在静态构造函数里面放复杂的逻辑,推荐只是一些简单的初始化逻辑。...如此能很大解决因为静态构造函数的时机问题导致的问题,无论什么时候碰到静态构造函数,如果静态构造函数只是非常简单的和无依赖的逻辑,那自然是没有什么问题 而如果是如本文要聊的,类型的静态构造函数里面,碰到了锁...Demo.Foo1.Number.get() 行 67 C# 也就是说 task1 尝试拿到 Foo1 的 Number 属性,需要先等待 Foo1 的静态构造函数执行完成。

56610

c#类及其方法和属性关键字权限

1.首先说关键字static(静态的) 它可以修饰类、方法、属性、字段 静态类:不能实例化,直接调用,它的内部成员必须是静态的,不能包含实例构造函数,调用方式是(类名.成员名) 静态类下的静态成员:静态方法和属性不能访问其包含类型静态字段和事件...举个例子,比如说一个数据库的连接字段(STRING).因为要经常使用到它,这时我们可以用STATIC.但是如果这时用静态的话那就不合算了,因为每次调用到它时,又实例化一次.这样相比来说占用内存就比较大了...静态类可以有构造函数,但是只被调用一次。 就上面说的程序配置数据部分,如果使用静态类,那么你需要在任何有可能访问到他的代码前手动初始化他,并且还要将他赋给一个静态变量后才能使用。...(4)虽然字段不能声明为 static const,但 const 字段的行为本质上是静态的。这样字段属于类,不属于类的实例。...因此,可以同对待静态字段一样使用 ClassName.MemberName 表示法来访问 const 字段C# 不支持静态局部变量(方法内部定义静态变量)。

68341

C#关键字常见面试题

readonly关键字(运行时常量):字段可以声明或构造函数初始化,常作为运行时常量使用。const关键字(编译时常量):字段只能在该字段的声明时初始化,常作为编译时常量使用过。...类、接口和结构,可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。static 修饰符不能用于索引器或终结器。 静态类与静态类的区别?...静态构造函数只调用一次,程序所驻留的应用程序域的生存期内,静态类会保留在内存(即使用Static修饰的类,应用一旦启用静态类就会保留在内存)。 静态类只包含静态成员 不能包含实例构造函数。...静态类会进行密封,因此不能继承。它们不能继承自任何类(除了 Object)。静态类不能包含实例构造函数。但是,它们可以包含静态构造函数静态成员和静态成员的区别?...成员主要指的是:字段、方法、属性、运算符、事件和构造函数等。 静态成员用static修饰符,静态成员不需要。 静态成员属于类所有,静态成员属于类的实例化对象所有。

13510

C# 7.3新特性一览

静态上下文中,不能使用隐式的this实例接收者,它包含的方法体没有定义this,如静态成员,它还包含不能使用this的地方,如字段初始化器和构造函数初始化器。...我们移除了ctor初始化器不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个构造函数函数体。...我们移除了字段或Property初始化器不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个初始化表达式。...静态上下文中,不能使用隐式的this实例接收者,它包含的方法体没有定义this,如静态成员,它还包含不能使用this的地方,如字段初始化器和构造函数初始化器。...我们移除了ctor初始化器不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个构造函数函数体。

1.1K30

C#学习笔记三: C#类型详解..

static字段和static构造函数 主要来说明执行的顺序: 1、编译器在编译的时候,先分析所需要的静态字段,如果这些静态字段所在的类有静态构造函数,那么就会忽略字段的初始化;如果没有静态构造函数...3、而带有静态构造函数的类的静态字段,只有引用到的时候才进行初始化。...其实分析这两种情况 只要记住第一条概念就好:如果这些静态字段所在的类有静态构造函数,那么就会忽略字段的初始化;如果没有静态构造函数,那么就会对静态字段进行初始化。...X = B.Y + 1; 所以会接着调用B.Y, 因为B静态构造函数,所以就会对静态字段进行初始化。...X = B.Y + 1; 所以会接着调用B.Y, 因为B中有静态构造函数,所以就会忽略字段的初始化。

1.3K140

c# readonly

C#,readonly特性用于声明一个只读字段。一个只读字段可以声明时或在构造函数内部进行初始化,一旦被赋予了初始值,它就不能被改变。...静态只读字段在运行时初始化,其初始化发生在静态构造函数(如果存在)或者在出现此类的任何其他静态成员之前。...readonly修饰的字段内存分配在哪里 C#,readonly关键字修饰的字段的内存分配位置取决于它是否被声明为静态(static)。...无论是静态还是非静态的 readonly 字段,都只能在声明时或在相应的构造函数初始化。对于静态 readonly 字段,这通常发生在静态构造函数或者第一次引用类之前。...对于静态 readonly 字段,它们实例构造函数初始化。

15850

c#面试题抽象类和接口的区别-金三银四面试:C#程序员经常遇到的30道基础面试题,想你所想

11、C#中有没有静态构造函数,如果有是做什么用的?   12、C#如何实现多态?   13、什么是反射?如何实现反射?   14、请解释流与文件有什么不同?   ...值类型没有与存储类的实例相关的系统开销,并且它们不需要构造函数。值类型可以有字段、属性和事件。它们也有静态静态方法。当它们被装箱时,会从System.继承虚方法,并可实现零个或更多接口。....;   11、C#中有没有静态构造函数,如果有是做什么用的?   有。静态构造函数用于初始化类。创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。...静态构造函数既没有访问修饰符,也没有参数。创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数程序,用户无法控制何时执行静态构造函数。   ...静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件写入项。   12、C#如何实现多态?

1.9K20
领券