C# final static是否自动使用延迟实例化?

C# final static是否自动使用延迟实例化?,c#,java,static,singleton,final,C#,Java,Static,Singleton,Final,页面上的代码如下所示: public final static Singleton INSTANCE = new Singleton(); 自动使用惰性实例化 我想核实一下 1) 所有的编译器都这样做,还是说编译器可以自由地做任何它想做的事情 2) 既然c#没有“final”关键字,那么将其转换为c#的最佳方式是什么(同时它也应该自动使用惰性实例化)是的。静态初始值设定项保证在您能够访问该实例之前运行。这种方法有两个缺点: 如果在Singleton的构造中发生错误,则该错误更难调试(“初始值设

页面上的代码如下所示:

public final static Singleton INSTANCE = new Singleton();
自动使用惰性实例化

我想核实一下

1) 所有的编译器都这样做,还是说编译器可以自由地做任何它想做的事情


2) 既然c#没有“final”关键字,那么将其转换为c#的最佳方式是什么(同时它也应该自动使用惰性实例化)

是的。静态初始值设定项保证在您能够访问该
实例之前运行。这种方法有两个缺点:

  • 如果在Singleton的构造中发生错误,则该错误更难调试(“初始值设定项中的错误”)
  • 在第一次使用该类时,该对象将被实例化。如果您使用了锁定方法,那么在需要之前不会实例化它。然而,由于该示例是一个单例,因此这根本不是问题,但它可能会拖累一段未使用但在其他地方惰性实例化的非单例代码
  • C#的翻译是
    只读
    ,而不是
    最终


    在我看来,这仍然比第二种方法(静态getter中的同步/锁定、检查实例化)要好得多,因为它不需要任何同步代码,而同步代码更快、更容易阅读,并且同样易于使用。

    是的。静态初始值设定项保证在您能够访问该
    实例之前运行。这种方法有两个缺点:

  • 如果在Singleton的构造中发生错误,则该错误更难调试(“初始值设定项中的错误”)
  • 在第一次使用该类时,该对象将被实例化。如果您使用了锁定方法,那么在需要之前不会实例化它。然而,由于该示例是一个单例,因此这根本不是问题,但它可能会拖累一段未使用但在其他地方惰性实例化的非单例代码
  • C#的翻译是
    只读
    ,而不是
    最终


    在我看来,这仍然比第二种方法(静态getter中的同步/锁定、检查实例化)要好得多,因为它不需要任何同步代码,而同步代码更快、更易于阅读,也同样易于使用。

    heys C中的只读也能确保延迟实例化吗?或者c#only中的readonly可以确保同步吗?有点像。这取决于您正在运行的.NET Framework版本(4之前版本或4+版本)。请参阅:(这曾经是我关于C#Singleton模式的文章;注意示例5)。对于.NET4,请参见与Java相同的延迟初始化位置。为避免任何混淆,请在.NET3.5+中使用。不幸的是,这在C#中是一个棘手的问题。heys C#中的只读也能确保延迟实例化吗?或者c#only中的readonly可以确保同步吗?有点像。这取决于您正在运行的.NET Framework版本(4之前版本或4+版本)。请参阅:(这曾经是我关于C#Singleton模式的文章;注意示例5)。对于.NET4,请参见与Java相同的延迟初始化位置。为避免任何混淆,请在.NET3.5+中使用。不幸的是,这在C#中是一个棘手的问题。