C#中静态字段声明时赋值与构造函数中赋值

Posted OctopusKing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中静态字段声明时赋值与构造函数中赋值相关的知识,希望对你有一定的参考价值。

C#中静态字段是属于类的,访问的时候:用类名点成员名的方式。

赋值初始化的时候,可以在声明的时候赋值,也可以在静态构造函数中赋值。

如果在声明中、静态构造函数中都赋值,那么最终该成员的值,是取自哪一个呢?

 

验证实例:声明一个类型Foo,含有一个静态成员,并且该静态成员在声明时、与静态构造函数中都赋了值。

  成员Result属性的作用是,将最终的静态属性FooNumber的值取出 

    public class Foo
    
     //  声明一个静态属性,并在声明的时候赋值
public static int FooNumber get; set; = 1234; public int Result get; set; static Foo() FooNumber = 20; public Foo() Result = FooNumber;

 

Main方法

    class Program
    
        static void Main(string[] args)
        
            Foo foo1 = new Foo();
            Console.WriteLine($"foo1对象中的FooNumber属性的最终值:foo1.Result");


            Console.ReadKey();
        
    

 

控制台结果:

 

 

通过ILSpy工具查看编译后生成的代码,如下:

 

 

结论:如果类中的静态字段或者属性,在声明时与静态构造函数中都赋值,那么编译器在编译的时候,会将声明时的值移动一个位置(至静态构造函数中,且在未编译前构造函数中的赋值之前)。

  从而最终显现的值为:编译前,在构造函数中所赋得值。

 

以上是关于C#中静态字段声明时赋值与构造函数中赋值的主要内容,如果未能解决你的问题,请参考以下文章

C# 常忘知识

类和结构体的区别

常量数据与只读字段

c#中泛型类构造函数重载赋值时为啥不接受null?对其赋空值应给怎么做?

const和readonly

C# 类声明一个数组字段,无法赋值,说变量在声明前无法使用