2011-12-29 7 views
8

私は、次の方法に関するご質問は、呼び出しを持っている:ジェネリック構文糖または真の改善

var ctl1 = this.FindControlRecursively("SomeField") as HiddenField; 
var ctl = this.FindControlRecursively<HiddenField>("SomeField"); 

ここでILは、これら2つのコールのためです。私はいつもこのような状況では思っている

IL_0010: ldstr  "AsyncReset" 
IL_0015: call  class [System.Web]System.Web.UI.Control [Amc.WebG081.MethodExtensions]Amc.WebG081.ControlExtensions::FindControlRecursively(class [System.Web]System.Web.UI.Control,string) 

IL_001a: isinst  [System.Web]System.Web.UI.WebControls.HiddenField 
IL_001f: stloc.0 
IL_0020: ldarg.0 
IL_0021: ldstr  "AsyncReset" 
IL_0026: call  !!0 [Amc.WebG081.MethodExtensions]Amc.WebG081.ControlExtensions::FindControlRecursively<class [System.Web]System.Web.UI.WebControls.HiddenField>(class [System.Web]System.Web.UI.Control,string) 

、このメソッドのジェネリック版は、真の改善に対してより「構文的な砂糖」でした。イリノイは別の話をしていますか?

答えて

8

GenericsはC#に組み込まれているため、「真の改善」です。したがって、ランタイムの共分散とコントラスト分散が可能な理由、ジェネリック型のリフレクション、ジェネリック型の実行時リフレクションベースの作成(List<T>、Tは実行時に決定されます)。

これは、テンプレートが多くの方法で構文的な砂糖であるC++とは異なります。コンパイラは実際に使用する汎用タイプごとにコードを生成します。したがって、これらの関数を使用する場合はAdd<int>,Add<long>Add<short>Add<MyClass>などを作成し、同様にクラスを作成します。これの主な利点は、演算子とそれ以外の小さなものです。+型の演算子を持ち、が+ bを返すと、すべての型がうまく動作します。 C#のコンパイラは、コンパイル時にany-and-all型の演算子宣言を解決できない/解決できないために不満を持ちます。さらに、C#(100%ではないがおそらく90%)は、参照型(その実装を使用している場合)に1つのジェネリック型の実装を作成し、各値の型ごとに1を作成します(int、long、Decimal、MyStructなど必要に応じて独自の実装を取得します)。 Javaで

関連する問題