2010-12-27 1 views

答えて

23

typeof()は、コンパイル時にそのタイプがわかっていて、対応するTypeオブジェクトを取得しようとしている場合にのみ使用できます。 (タイプは汎用タイプのパラメータでもよいが、タイプパラメータTのクラス内でtypeof(T)など)。typeofを使用できるタイプのインスタンスは必要ありません。 typeofのオペランドは、常に型または型パラメータのの名前です。それは変数やそのようなものであってはなりません。

は今object.GetType()ていることを比較します。それは呼び出されたオブジェクトの実際の型を取得します。これが意味:

  • あなたはコンパイル時にタイプを知っている必要はありません(通常は、あなたにはありません)
  • あなたはは、型のインスタンスがあることが必要です(あなたが持っているそうでないと上GetTypeを呼び出すためには何も)
  • 実際の型は、コードにアクセスできるようにする必要はありません - 例えば、それは

ワン奇数ポイント異なるアセンブリ内の内部型が考えられます。GetTypeが予期しない与えます答えボクシングの仕方によって、null値型でGetTypeへの呼び出しは、常にボクシングnull許容値型を含む任意の値型、およびnull許容値型のボックス化値を含むであろうnull参照または非null許容値型のインスタンスへの参照のいずれかです。

7

GetType()は実行時に動作しますが、typeof()はコンパイル時の演算子です。

ので、

// untested, schematic 
void ShowType(Object x) 
{ 
    Write(x.GetType().Name); // depends on actual type 
    // typeof(x) won't actually compile 
    Write(typeof(x).Name); // always System.Object 
} 

ShowType("test"); 

が可能System.StringとのSystem.Objectを印刷します。

は、より良い例えばthis questionを参照してください。

+4

実際には、 'typeof'はインスタンスでは使用できないので、' typeof(x) 'はコンパイルされません。 –

+0

@Romain:そうです、コメントを追加しました。一般的な方法を使用して、これをいくらか実証することができます。 –

+0

typeof(インスタンス)はコン​​パイルされませんか? – Gishu

2

メソッドGetTypeは、オブジェクト上の仮想メソッドである - これは、クラスのインスタンスを与え、あなたが対応するTypeオブジェクトを取得できることを意味します。これは、ルックアップ、すなわち、クラス名を表すシンボルを考えると、そのためのTypeオブジェクトを取得し、コンパイル時間を実行するために使用される -

typeof演算は、C#の演算子です。

if (typeof(String) == "test".GetType()) 
0

それはまったく同じではない、とあなたは 継承を使用するときに問題が表示されます。

I.e.:

WebPage1Pageから継承し、この1つはObjectからも継承するので、あなたは(new WebPage1()).GetType() == typeof(object)をテスト場合は種類がdiferentあるので、それはfalseを返しますが、あなたはそれが本当だis演算子を使用してテストするとき。 (new WebPage1())タイプWebPage1の対象であり、またPageobjectため

((new WebPage1()) is object)

は真です。

タイプは異なる可能性がありますが、にこのタイプを安全にキャストできるかどうかを確認します(is)。

関連する問題