私は次のコードを取得しました:
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
出力は次のとおりです。
System.Int32
System.Object
なぜ両方ではないのSystem.Object
ですか?
このGetType()
関数は、インスタンスの実際のタイプを変数に返します。
変数はとして宣言されていますがobject
、実際にはボックス化されたインスタンス を保持しています。Int32
boxedObject.GetType()がObjectを返さない理由を尋ねる場合は、MSDNの[BoxingandUnboxing]ページの[BoxingConversion ]セクションにある画像を確認してください。良い質問ところで..少なくともあなたの質問の私の理解。
技術的には正しくないかもしれませんが、
ボクシングのトピックを無視すると、すべてのクラスはオブジェクト型から継承します。これは、参照型と値型の両方に当てはまります。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
これは実際にはボクシングについてではありません。これはの動作についてGetType
です。変数が宣言されたタイプではなく、変数の値のタイプを返します。
object var4 = new List<string>();
Console.WriteLine(var4.GetType().ToString());
どちらも戻りませんSystem.Object
。
変数の宣言はコンパイル時のみの情報ですが、メソッドの実行は実行時です。つまり、GetType()は実行時にオブジェクトの実際のタイプしか知ることができないため、オブジェクトが宣言されたタイプを知る方法はありません。
あなたが持っていた場合も同様
class a
{
}
class b : a
a bInstance = new b();
bInstance.GetType();
bInstance.GetType()の呼び出しには、変数がタイプ'a'として宣言されたことを知る方法がなく、この場合も'a'を返すことはないと思います。ただし、上記の例では、aはobjectの略語であり、bはSystem.Int32の略語です。