• 类型初始值设定项引发异常


    今天在使用VS2010调试程序时,出现这个自己以前从未接触过的错误“类型初始值设定项引发异常”。自己上网查找了相关资料,终找到原因,先记录下来。

    问题:

    在我的项目里,有一个数据库助手类“SqlHelper”,其中的成员皆是静态成员。但由于我改动这个类时,类中的数据库连接变量未被具体赋值,代码如下:

    private static string connstr = ConfigurationManager.ConnectionStrings[" "].ConnectionString;
    

    正确时应该是这样的:

    private static string connstr = ConfigurationManager.ConnectionStrings["DB_OnLineExamConnectionString"].ConnectionString;
    

    其中“DB_OnLineExamConnectionString”是web配置文件中的数据库连接字符串。

    所以,由于一个本不该有的疏忽导致了这个错误,惭愧!

    究其原因:

    原来类的静态成员在初始化时如果出现异常,访问类的其它静态成员或对该类进行初始化都会抛出这个异常。

    总结:

    TypeInitializationExeption在MSND中的描述为:当类初始值设定项不能初始化类型时,将创建 TypeInitializationException 并向其传递由该类型的类初始值设定项引发的异常引用。

    我们知道,类型初始化或者访问类型的静态成员时,都会对类中的其他静态成员进行初始化,并执行静态构造函数(如果有的话)。在这些过程中如果任一环节出现例如下面的代码:

    class ClassHelper
         {
             public static string Field = Do("Initial the static field");
             public static string StaticString = "Initaial static string";
             public string NonStaticString = "Initial non static string";
             public ClassHelper()
             {
                 NonStaticString = "Change non static string in instance constructor";
                 StaticString = "Change static string in instance constructor";
             }
             public static string Do(string field)
             {
                 Console.WriteLine(field);
                 throw new Exception();
                 return field;
             }
         }
     
    

      

    那么产生TypeInitializationException的情况就包含以下几种:

    1. 访问类的某一静态成员,而其他静态成员的初始化(或静态构造函数中)产生异常。例如访问ClassHelper.StaticString,由于静态成员Field的初始化产生异常,因此调用ClassHelper.StaticString会抛出TypeInitializationException。

    2. 访问类的某一静态成员,该静态成员的初始化(或静态构造函数中)产生异常。例如访问ClassHelper.Field。

    3. 对该类进行初始化,而类中的某个静态成员初始化(或静态构造函数中)产生异常。例如ClassHelper helper = new ClassHelper()。

    参考自:姚琪琳的类型初始值设定项引发异常一文,特此鸣谢!

      

      

  • 相关阅读:
    Input(Checkbox)全选删除
    DropDownList查询&Input(Checkbox)查询
    分页(二)
    webform---组合查询&流水号生成
    (转)C#生成中文汉字验证码源码(webform)
    文件上传
    [转]用C#如何实现大文件的断点上传
    DOM操作----open()
    经典背包问题的探讨
    贪心算法----正整数分解问题 和相同,乘积最大
  • 原文地址:https://www.cnblogs.com/xinai/p/xinai_20120315_1.html
Copyright © 2020-2023  润新知