web-dev-qa-db-ja.com

GetType()またはtypeof()を使用するタイミングと場所

これが機能する理由

if (mycontrol.GetType() == typeof(TextBox))
{} 

そして、これはしませんか?

Type tp = typeof(mycontrol);

しかし、これは動作します

Type tp = mycontrol.GetType();

私自身は型のチェックにis演算子を使用していますが、typeof()およびGetType()を使用すると理解に失敗します

GetType()またはtypeof()を使用する場所とタイミング

55
Nikhil Agrawal

typeof は、compile-time(または少なくとも一般的な型パラメーター)で既知の型を取得する演算子です。 typeofのオペランドは、常に型または型パラメーターの名前です-never値を持つ式(変数など)。詳細については、 C#言語仕様 を参照してください。

GetType() は、オブジェクトのexecution-timeタイプを取得するために、個々のオブジェクトで呼び出すメソッドです。

onlyのみ(サブクラスのインスタンスではなく)TextBoxのインスタンスを正確に必要としない限り、通常使用することに注意してください。

if (myControl is TextBox)
{
    // Whatever
}

または

TextBox tb = myControl as TextBox;
if (tb != null)
{
    // Use tb
}
95
Jon Skeet

typeofは、コンパイル時に既知の型またはジェネリック型パラメーターの名前に適用されます。 GetTypeは、実行時にオブジェクトで呼び出されます。どちらの場合も、結果はタイプのメタ情報を含むタイプSystem.Typeのオブジェクトです。

あなたが持っている場合

string s = "hello";

これらの2行は有効です

Type t1 = typeof(string);
Type t2 = s.GetType();

t1 == t2 ==> true

しかし

object obj = "hello";

これらの2行は有効です

Type t1 = typeof(object); // ==> object
Type t2 = obj.GetType();  // ==> string!

t1 == t2 ==> false

つまり、変数objのコンパイル時型(静的型)は、objによって参照されるオブジェクトのランタイム型と同じではありません。


テストタイプ

ただし、mycontrolTextBoxであるかどうかだけを知りたい場合は、単純にテストできます。

if (mycontrol is TextBox)

これは完全に同等ではないことに注意してください

if (mycontrol.GetType() == typeof(TextBox))    

mycontrolTextBoxから派生した型を持つことができるためです。その場合、最初の比較ではtrueと2番目のfalse!が得られます。 TextBoxから派生したコントロールはTextBoxが持つすべてを継承し、おそらくそれをさらに追加するため、TextBoxとの割り当て互換性があるため、ほとんどの場合、最初の簡単なバリアントは問題ありません。

public class MySpecializedTextBox : TextBox
{
}

MySpecializedTextBox specialized = new MySpecializedTextBox();
if (specialized is TextBox)       ==> true

if (specialized.GetType() == typeof(TextBox))        ==> false

キャスティング

次のテストに続いてキャストがあり、TがNULL入力可能の場合...

if (obj is T) {
    T x = (T)obj; // The casting tests, whether obj is T again!
    ...
}

...に変更できます...

T x = obj as T;
if (x != null) {
    ...
}

値が特定の型であるかどうかのテストとキャスト(この同じテストを再度含む)は両方とも、長い継承チェーンでは時間がかかる可能性があります。 as演算子に続いてnullのテストを使用すると、パフォーマンスが向上します。

C#7.0以降では、パターンマッチングを使用してコードを簡素化できます。

if (obj is T t) {
    // t is a variable of type T having a non-null value.
    ...
}

typeOf は、クラスの名前があるときに使用されるC#キーワードです。コンパイル時に計算されるため、実行時に作成されるインスタンスでは使用できません。 GetType は、インスタンスで使用できるオブジェクトクラスのメソッドです。

8
Fr33dan

isキーワード を使用する方が簡単な場合があります。

if (mycontrol is TextBox)
5