可能性の重複:
Type Checking: typeof, GetType, or is?GetType()とtypeof()を使用してTypeを取得する方法の違いは何ですか?
1の型を取得するための好ましい方法は何ですか?
可能性の重複:
Type Checking: typeof, GetType, or is?GetType()とtypeof()を使用してTypeを取得する方法の違いは何ですか?
1の型を取得するための好ましい方法は何ですか?
typeof()
は、コンパイル時にそのタイプがわかっていて、対応するType
オブジェクトを取得しようとしている場合にのみ使用できます。 (タイプは汎用タイプのパラメータでもよいが、タイプパラメータT
のクラス内でtypeof(T)
など)。typeof
を使用できるタイプのインスタンスは必要ありません。 typeof
のオペランドは、常に型または型パラメータのの名前です。それは変数やそのようなものであってはなりません。
は今object.GetType()
ていることを比較します。それは呼び出されたオブジェクトの実際の型を取得します。これが意味:
GetType
を呼び出すためには何も)ワン奇数ポイント異なるアセンブリ内の内部型が考えられます。GetType
が予期しない与えます答えボクシングの仕方によって、null値型でGetType
への呼び出しは、常にボクシングnull許容値型を含む任意の値型、およびnull許容値型のボックス化値を含むであろうnull参照または非null許容値型のインスタンスへの参照のいずれかです。
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を参照してください。
メソッドGetTypeは、オブジェクト上の仮想メソッドである - これは、クラスのインスタンスを与え、あなたが対応するTypeオブジェクトを取得できることを意味します。これは、ルックアップ、すなわち、クラス名を表すシンボルを考えると、そのためのTypeオブジェクトを取得し、コンパイル時間を実行するために使用される -
typeof演算は、C#の演算子です。
if (typeof(String) == "test".GetType())
それはまったく同じではない、とあなたは 継承を使用するときに問題が表示されます。
I.e.:
WebPage1
Page
から継承し、この1つはObject
からも継承するので、あなたは(new WebPage1()).GetType() == typeof(object)
をテスト場合は種類がdiferentあるので、それはfalseを返しますが、あなたはそれが本当だis
演算子を使用してテストするとき。 (new WebPage1())
タイプWebPage1
の対象であり、またPage
とobject
ため
((new WebPage1()) is object)
は真です。
タイプは異なる可能性がありますが、にこのタイプを安全にキャストできるかどうかを確認します(is
)。
実際には、 'typeof'はインスタンスでは使用できないので、' typeof(x) 'はコンパイルされません。 –
@Romain:そうです、コメントを追加しました。一般的な方法を使用して、これをいくらか実証することができます。 –
typeof(インスタンス)はコンパイルされませんか? – Gishu