8

我正在研究一些基于微软会员资格的定制身份验证代码。在查看 Profile 功能时,我查看了 System.Web.dll v4.0.30319 中的 ProfileBase 类。有一些类级别的变量被声明为一种类型,然后初始化为一个强制转换为该类型的空值。

例如,

private static Exception s_InitializeException = (Exception) null;
private static ProfileBase s_SingletonInstance = (ProfileBase) null;
private static Hashtable s_PropertiesForCompilation = (Hashtable) null;

我通常不初始化具有类级别范围的变量。我想知道这是否是我应该做的事情或者它有什么目的。

感谢您的任何启发。

4

5 回答 5

7

您可能正在查看反汇编代码。这个转换可能是由反汇编程序添加的,它在源代码中不存在。

您绝对不必在代码中进行这种类型的转换。

于 2012-05-29T18:46:23.273 回答
6

这没有任何意义;我相信null总是null如此——我当然想不出在基于 C 的语言中没有的任何例子。它可能是生成的代码,而不是像那样显式编写的代码。

于 2012-05-29T18:41:18.543 回答
1

该代码在说什么:初始化一个内存区域以保存一种异常类型,并将值 NULL 分配给该变量。由于 Exception 是引用类型,因此它可以为 null。将 NULL 转换为 Exception 是没有意义的。也许生成的代码?

于 2012-05-29T18:44:52.053 回答
1

推荐的做法是在声明它们的地方初始化静态变量。

这是实际的 Microsoft 代码:

    /////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////// 
    // Static data 
    private static SettingsPropertyCollection s_Properties = null;
    private static object s_InitializeLock = new Object(); 
    private static Exception s_InitializeException = null;
    private static bool s_Initialized = false;
    private static ProfileBase s_SingletonInstance = null;
    private static Hashtable s_PropertiesForCompilation = null; 
于 2012-05-29T18:45:02.570 回答
1

演员表由您的反编译器生成 - “官方”源有null,但没有演员表。我认为添加演员表没有任何好处。

我通常不初始化具有类级别范围的变量。我想知道这是否是我应该做的事情或者它有什么目的。

null在原始来源中)似乎主要一种风格。由于在声明中初始化静态字段通常更容易,因此添加它null会增加一些清晰性,即故意将其保留为未初始化。它还可以通过 FXCop 或类似的风格指南检查。

于 2012-05-29T19:19:33.710 回答