8

私は次のコードを取得しました:

object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());

出力は次のとおりです。

System.Int32
System.Object

なぜ両方ではないのSystem.Objectですか?

4

5 に答える 5

7

このGetType()関数は、インスタンスの実際のタイプを変数に返します。

変数はとして宣言されていますがobject、実際にはボックス化されたインスタンス を保持しています。Int32

于 2010-08-10T08:51:40.680 に答える
4

boxedObject.GetType()がObjectを返さない理由を尋ねる場合は、MSDNの[BoxingandUnboxing]ページの[BoxingConversion ]セクションにある画像を確認してください。良い質問ところで..少なくともあなたの質問の私の理解。

技術的には正しくないかもしれませんが、

  • ヒープに移動すると、新しいオブジェクトが作成されます。そのTypeポインターは、元の値型のTypeオブジェクト(ここではSystem.Int32)に設定されます。これはGetType()を説明しています(また、別のタイプに箱を開けようとするとエラーが発生します)。
  • 次に、実際の値がこのオブジェクトにコピーされます。
于 2010-08-10T09:10:21.100 に答える
3

ボクシングのトピックを無視すると、すべてのクラスはオブジェクト型から継承します。これは、参照型と値型の両方に当てはまります。GetTypeは、最も派生したタイプ(この場合はSystem.Int32)を示します。

GetTypeがSystem.Objectを返す数少ない回数の1つは、これを行う場合です。

object var = new Object();
Console.WriteLine(var.GetType().ToString());

ボックス化とは、値型が参照型によって示される場合を指します。通常、これはSystem.Object参照として実行されます。TypeOfは、参照タイプではなく、最も派生した実際のタイプを返します。

class A
{
}

class B : A
{
}

class C : B
{
}

object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();

GetTypeは、これらのタイプに対して同様のことを行います。

System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());

ClassA
ClassB
ClassC

于 2010-08-10T08:53:54.937 に答える
1

これは実際にはボクシングについてではありません。これはの動作についてGetTypeです。変数が宣言されたタイプではなく、変数ののタイプを返します。

    object var4 = new List<string>();
    Console.WriteLine(var4.GetType().ToString());

どちらも戻りませんSystem.Object

于 2010-08-10T08:56:40.177 に答える
0

変数の宣言はコンパイル時のみの情報ですが、メソッドの実行は実行時です。つまり、GetType()は実行時にオブジェクトの実際のタイプしか知ることができないため、オブジェクトが宣言されたタイプを知る方法はありません。

あなたが持っていた場合も同様

class a
{
}

class b : a

a bInstance = new b();
bInstance.GetType();

bInstance.GetType()の呼び出しには、変数がタイプ'a'として宣言されたことを知る方法がなく、この場合も'a'を返すことはないと思います。ただし、上記の例では、aはobjectの略語であり、bはSystem.Int32の略語です。

于 2010-08-10T09:36:45.727 に答える