放置静态构造函数时不能使用 static class

Cannot use static class when placing a static constructor

我有以下静态 class:

public static class UnitTestDefinitions
{
    public static int Foo = 4;

    /// <summary>
    ///     static constructor
    /// </summary>
    static UnitTestDefinitions()
    {
        InitAccounts();
    }

     private static void InitAccounts()
     {
         // some code
     }

     // more code
 }

我有一个 NUnit 测试失败 运行 因为我无法访问 Foo :

我得到的实际异常是:

System.TypeInitializationException was unhandled by user code
HResult=-2146233036 Message=The type initializer for 'Ublux.Communications.PrimaryService.UnitTestDefinitions' threw an exception. Source=Ublux.Communications.CoreService
TypeName=Ublux.Communications.PrimaryService.UnitTestDefinitions
StackTrace: at Ublux.Communications.CoreService.UnitTests.TestCloudServicesCore.TestAuthentication() in C:\GIT\Ublux\Ublux Communications Core Service\Ublux.Communications.CoreService\Ublux.Communications.CoreService\UnitTests\TestCloudServices_Core.cs:line 146 InnerException: HResult=-2146233040 Message=Exception of type 'System.Threading.ThreadAbortException' was thrown.

我使用 c# 有一段时间了,所以对我来说很明显问题出在静态构造函数中,换句话说,方法一定有问题 InitAccounts().


因此,我删除了静态 class UnitTestDefinitions 上的静态构造函数并手动调用 InitAccounts() 方法:

当我这样做时,我没有例外,一切都很好,为什么?

用户无法控制何时在程序中执行静态构造函数。如果您的 InitAccounts() 方法试图访问尚未初始化的对象,您可能会遇到异常。由于您尚未提供该代码,因此很难说。这是完全避免 static 类 的一个重要原因(必要时使用 Singleton)。