8

私は、Microsoft のメンバーシップに基づいて、カスタマイズされた認証コードに取り組んでいます。プロファイル機能を調べているときに、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;

通常、クラス レベルのスコープを持つ変数を初期化することはありません。これは私がやるべきことなのか、それが何の目的に役立つのか疑問に思っています。

啓発をありがとう。

4

5 に答える 5

7

おそらく、逆アセンブルされたコードを見ているでしょう。このキャストはおそらく逆アセンブラーによって追加されたものであり、ソース コードには存在しませんでした。

コードでこの種のキャストを行う必要はまったくありません。

于 2012-05-29T18:46:23.273 に答える
6

これには意味がありません。私nullは常にそうだと信じていますnull- そうでない C ベースの言語の例は確かに考えられません。そのように明示的に記述されたコードではなく、おそらく生成されたコードです。

于 2012-05-29T18:41:18.543 に答える
1

キャストは逆コンパイラーによって生成されます。「公式」ソースにはありますnullが、キャストはありません。キャストを追加しても何のメリットもありません。

私は通常、クラスレベルのスコープを持つ変数を初期化しません。これが私がやるべきことなのか、それともどのような目的に役立つのか疑問に思います。

(元のソースにあります)は、ほとんどがスタイルのもののようnullです通常、宣言で静的フィールドを初期化する方が簡単なので、nulladdsを追加すると、意図的に初期化されないままになっていることが少し明確になります。また、FXCopまたは同様のスタイルガイドラインのチェックに合格するのにも役立ちます。

于 2012-05-29T19:19:33.710 に答える
1

コードの意味: メモリ領域を初期化して Exception の型を保持し、値 NULL をその変数に割り当てます。Exception は参照型であるため、null にすることができます。例外に NULL をキャストしても意味がありません。多分生成されたコード?

于 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 に答える