ボクシングとボクシング、なぜ出力が「System.Object」の両方ではないのですか?
質問
次のコードがありました:
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
出力は次のとおりです。
System.Int32
System.Object
なぜ彼らは両方ではないのですか System.Object
?
解決
BoxedObject.getType()がオブジェクトを返さない理由を尋ねている場合。 セクション「ボクシング変換」の下で画像をチェックしてください に MSDNボクシングとボクシングページ. 。良い質問ところで..あなたの質問についての私の理解。
私は技術的には正しくないかもしれませんが、それは
- ヒープに移動すると、新しいオブジェクトが作成されます - 元の値タイプのタイプオブジェクトに設定されたそのタイプポインター (ここではsystem.int32)。これは、getType()を説明しています(また、別のタイプにボックス化しようとする場合のエラーも説明します)。
- 実際の値がこのオブジェクトにコピーされます。
他のヒント
GetType()
関数変数内のインスタンスの実際のタイプを返します。
変数はとして宣言されていますが object
, 、それは実際です ホールディング 箱入り Int32
実例。
ボクシングのトピックを無視すると、すべてのクラスがタイプオブジェクトから継承されます。これは、参照タイプと値タイプの両方に当てはまります。 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());
クラス
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」を返すとは思わないと思います。ただし、上記の例では、オブジェクトの私の略語で、bはsystem.int32です。