代码之家  ›  专栏  ›  技术社区  ›  Tono Nam

放置静态构造函数[重复]时无法使用静态类

  •  -2
  • Tono Nam  · 技术社区  · 6 年前

    我有以下静态类:

    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 :

    enter image description here

    我得到的实际例外是:

    系统用户代码未处理TypeInitializationException
    HResult=-2146233036 Message=的类型初始值设定项 'uLux。通信。PrimaryService。UnitTestDefinitions'引发了 例外来源=Ublux。通信。CoreService公司
    TypeName=Ublux。通信。PrimaryService。UnitTestDefinitions单元测试定义
    堆栈跟踪: 在Ublux。通信。CoreService。单元测试。TestCloudServicesCore。TestAuthentication() 在C:\GIT\Ublux\Ublux通信核心中 服务\u流量。通信。CoreService\uFlux。通信。CoreService\UnitTests\TestCloudServices\u核心。cs:线条 146内部异常: HResult=-2146233040 消息=类型为“System”的异常。穿线。引发了ThreadAbortException“”。

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


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

    enter image description here

    当我这样做的时候,我也不例外,一切都很好。为什么?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mike Lowery    6 年前

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