2012-05-29 37 views
8

我正在研究一些基於微軟會員資格的定製認證代碼。在查看Profile功能的同時,我查看了System.Web.dll v4.0.30319中的ProfileBase類。有幾個類級變量被聲明爲一個類型,然後被初始化爲一個轉換爲該類型的空值。微軟正在將null轉換爲類型,我應該如何?

例如,

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

我通常不初始化有一個類級別範圍內的變量。我想知道這是我應該做的事還是它的用途。

感謝您的任何啓示。

+10

你正在看原始源代碼或反彙編? –

+0

此代碼被Re-sharper檢索到,所以我確定它是反彙編的源代碼。謝謝。 –

回答

7

你可能看disassemblied代碼。 這個轉換可能是反彙編程序添加的,它並不存在於源代碼中。

您絕對不必在代碼中進行這種類型的投射。

6

這是毫無意義的;我相信null總是null - 我當然不能想到C語言中的任何例子。它可能是生成的代碼,而不是像那樣明確寫入的代碼。

1

該代碼說的是什麼:初始化內存區域以保存一種類型的異常,並將該值分配給該變量。由於Exception是一個引用類型,因此它可以爲null。沒有必要將NULL轉換爲Exception。也許生成的代碼?

+0

這並不是說要初始化任何東西 - 沒有'new'來分配內存。它只是聲明一個「指向」無用的變量。 – Luke

+0

我的不好 - 它是靜態的 - 在跳入之前沒有正確地閱讀這個問題。 – RobertMS

1

建議的做法是在聲明它們的地方初始化靜態變量。

下面是實際的微軟的源代碼:

///////////////////////////////////////////////////////////////////////////// 
    ///////////////////////////////////////////////////////////////////////////// 
    // 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; 
1

劇集由您的反編譯器生成 - 「官方」來源有null,但沒有劇集。我沒有看到添加演員的好處。

我通常不會初始化具有類級範圍的變量。我想知道這是我應該做的事還是它的用途。

null(這是原始出處)似乎大多是一種風格的東西。由於在聲明中初始化靜態字段通常更容易,因此添加null會增加一些清晰度,故意將其保留爲未初始化狀態。它也可以通過FXCop或類似的風格指南檢查。

相關問題