设置静态公共变量的System.TypeInitializationException

时间:2016-11-01 13:01:29

标签: c# console-application

在同一名称空间中,我有这两个函数

public static class DAL
{
    public static bool SHOWMESSAGES = false;
    private static StreamWriter logger = new StreamWriter(logLocation); // line 4
}


class testmain
{
    static public void Main(string[] args)
    {
        DAL.SHOWMESSAGES = true; //line 5
    }
}

如果我运行此代码,我将得到一个“未发生类型'System.TypeInitializationException'的未处理异常”。可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

在.NET中,类型不会在应用程序启动时初始化,而是在第一次访问类型时初始化。在你的情况下,它可能在第5行:DAL.SHOWMESSAGES = true;

在执行此语句之前,必须初始化DAL类。执行静态构造函数,并将所有静态字段设置为其默认值。如果失败,您将获得TypeInitializationException

我建议你避免使用默认值的静态构造函数和静态字段,例如: private static _someField = new SomeClass();

我的情况看起来像这样:

public static class DAL
{
    public static bool SHOWMESSAGES = false;
    private static StreamWriter logger;
    public static void Initialize() 
    {
        logger = new StreamWriter(....);
    }
}

甚至更好,完全避免静态类:

public class DAL
{
    public bool ShowMessages { get; set; }
    private StreamWriter logger;
    public DAL() 
    {
        logger = new StreamWriter(....);
    }
}

class testmain
{
    static DAL dal;
    static public void Main(string[] args)
    {
        dal = new DAL();
        dal.ShowMessages = true;
    }
}