6

私はValueType クラスについて読んでいましたが、何かが ValueType にキャストされたときに、それがボックス化されているかどうか疑問に思っていますか? 例:

void DoSomething(ValueType valueType)
{
}

DoSomething(5);

リテラルでint表されたもの5は、DoSomething メソッドで受け取ったときにボックス化されましたか?

4

3 に答える 3

3

はい、箱入りです。

考えてみてください...値がボックス化されないようにするには、すべての組み込み型と将来定義する可能性のある構造体を含む、任意の値型にできる共通のバイナリ表現が必要です。

このようなバイナリ表現は存在しないため、値をボックス化する必要があります。

説明:

パラメータを使用してメソッドを呼び出すと、呼び出し元はビットのシーケンスを合意された場所に合意された形式で配置します。たとえば、int は 1 の補数としてエンコードされた負の数を持つ 32 ビットであり、double は IEEE 浮動小数点でエンコードされた 64 ビットです。フォーマットなど

ボックス化されていない int と double の両方を除外できる 1 つのメソッドを持つことはできません。これは、読み取るビット数とそれらをデコードする方法がわからないためです。

メソッドに両方を受け入れさせたい場合は、関数に値のメモリ位置 (位置自体は既知のサイズと形式であるため、メソッドはそれをデコードする方法を認識します) といくつかのメタデータを指定して、メソッドが実際の型を認識できるようにすることができます。値の - 値をメタデータでラップし、そのメモリの場所を提供することは (驚き、驚き) 「ボクシング」と呼ばれます

したがって、パラメーター/変数/システムが値をボックス化する必要がある正確な型ではないものを使用して値を渡すたびに、値が実際に使用するメモリの量と、そのメモリを一連のシーケンスからデコードする方法を受信者が知りません。ビットを数値または構造体に戻します。

参照型は常にメモリ ロケーションを使用して渡されるため、これは値型にのみ適用されます (メモリ ロケーションは .net では「参照」と呼ばれます)。

于 2012-09-19T10:44:37.913 に答える
2

はい、そうValueTypeです、クラスです(したがって、参照型であるため、ボックス化が発生します)。

この質問は同様の根拠をカバーしています:

Enum の HasFlag メソッドにボクシングが必要なのはなぜですか?

于 2012-09-19T10:44:22.543 に答える
0

リンク先のMSDN記事のMarc Gravellのコメントによると、そうです。

ValueType を使用して値を値型に制限することはできますが、ValueTypeへのキャスト (暗黙的または明示的) は依然としてボックス化操作であることを強調する必要があります。具体的な既知の値の型 ("DateTime"、"int" など) のみを値の型として直接処理できます。ValueType 自体はクラスとして扱われます (ボックス化)。

于 2012-09-19T10:44:18.523 に答える