为什么这行抛出异常会导致类型初始化失败?

时间:2012-06-19 14:49:47

标签: c# asp.net .net c#-4.0 asp.net-4.0

我上课了:

public class Constant
{

    public static string ConnString = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
}

会在LIVE上抛出异常:Constant ctor

的类型初始化失败

如果我将课程改为:

public class Constant
{
    public static string ConnString
    {
        get
        {
            return ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
        }
    }
}

它有效。我浪费了2个小时,但我仍然不知道为什么会这样。有什么想法吗?

注意:第一类曾经在DEV环境中工作但在LIVE上没有。第二类适用于DEV和生产。

我在生产和Asp.Net 4.0网站项目中使用VS2010。

至少可以说,我对这种不一致感到惊讶!

修改:此课程位于App_Code文件夹中。

3 个答案:

答案 0 :(得分:2)

我认为主要区别在于:

  • 第一个是在初始化Constant类时计算的
  • 第二次评估是第一次访问ConnString属性(因此可能初始化阶段已完成)

答案 1 :(得分:1)

显然这一行

ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString

将在LIVE上抛出异常。

在第一种情况下,这会发生在类构造函数中,因此类型初始化失败。

在第二种情况下,异常会延迟,直到您使用该属性。

答案 2 :(得分:0)

可能由于某种原因,在第一个示例中初始化Constant时,ConfigurationManager未初始化。但是,Class 2将在ConfigurationManager实际需要时获取属性,而不是在初始化Constant类时获取属性。