在静态构造函数中初始化静态变量而不是直接赋值有什么好处

问题描述 投票:0回答:3

在下面提到的代码中,有两种方法可以为静态变量“RateOfInterest”赋值。

  1. 直接赋值。
  2. 通过在静态构造函数中赋值。

我相信对于“Customer”类的多个对象,“RateOfInterest”使用任一方法都将只有一个内存分配。 (如有错误请指正)。

一种方法相对于另一种方法有什么具体优势吗?

class Customer
{
    int AccNo;
    static int RateOfInterest;
    //static int RateOfInterest = 10;    // Approach 1
    static Customer()
    {
        RateOfInterest = 10;          // Approach 2
    }
    public Customer(int AccNo)
    {
        this.AccNo = AccNo;
    }
    public void Display()
    {
        Console.WriteLine($"AccNo : {AccNo}, Rate : {RateOfInterest}");
    }
}
c# .net oop c#-4.0 constructor
3个回答
2
投票

它们将被编译成相同的东西。所以没有区别,

这不是私有构造函数。那是静态构造函数

静态构造函数用于初始化任何静态数据,或执行只需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前会自动调用它

当直接赋值时,行变得太长(这是基于意见的)或者当我需要多行来初始化值时,我使用静态构造函数。


1
投票

实际上,这两种方法没有区别。

如果您想分配一个文字值,例如

10
,那么直接在声明处分配它会更快。

但是如果你的变量的初始化更复杂,就像这样:

val = new MyClass();
val.A = 1;
val.B = "Hi";
val.SomeMethod();
val.AnotherMethod();

你应该把它放在静态构造函数中。


0
投票

由于这个问题专门针对一种变体的优点,因此官方文档是这样说的:

声明为静态只读的字段只能作为其声明的一部分或在静态构造函数中进行分配。当不需要显式静态构造函数时,请在声明时初始化静态字段,而不是通过静态构造函数来初始化,以获得更好的运行时优化。

https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

因此,由于承诺“更好的运行时优化”,在声明时进行初始化是首选。

除此之外,请注意,如果构造函数失败,可能会影响多个未设置的字段:

如果静态构造函数抛出异常,运行时不会再次调用它,并且该类型将在应用程序域的生命周期内保持未初始化状态。

(同源)

如果由于某种原因异常被外部捕获,则异常之后的构造函数中的所有内容都不会被初始化。对于声明时的各个初始化,这可能有所不同,我预计(未经验证!)只有受影响的分配会失败。

回答了OP的问题后,我个人的做法与M.kazem Akhgary完全一样:如果它更具可读性或更方便,我使用静态构造函数。 IMO 性能差异将介于微小和可以忽略不计之间,并且异常场景主要是理论上的。

© www.soinside.com 2019 - 2024. All rights reserved.