2013-10-23 13 views
6

ECMA-335,1.8.2.4は、ボックスタイプに参照タイプ(管理ポインタ/バイリフを除く)と汎用パラメータが含まれることを指定します。なぜボクシングのリファレンスタイプですか?

ボクシング参照型の目的は何ですか?ボックス化された参照オブジェクトの機能とメモリの表現は、ボックス化されていないものと比較して異なるか?

+2

.NETでは参照型をボックス化できますが、C#ではボックス化できません。ランタイムはそれを可能にしますが、その機能はC#コンパイラによって活用されることはありません。 – Servy

+0

@セイビー、実際にはどうやって動いているのですか?それは 'var o =(object)myRefInstance;'のようなものでしょうか? 'myRefInstance'はすでに' object'を基にしているので、それは変です。 –

+2

また、 "typeTokが参照型の場合、ボックス命令はvalをそのままobjとして返します" - III.4.1。 –

答えて

5

参照型参照のボクシングには論理的に問題はありません。それはちょうどノーオペレーションで、何も変わりません。

しかし、Ecma-335は、が実際にはが.NET CLRに実装されているため、必ずしも良い説明ではありません。 Opcodes.Boxを実装するJIT_Box()ヘルパ関数は、値の型ではない値をボックスに入力するときに実際にInvalidCastExceptionをスローします。コンパイラとジッタは、ボクシングの変換が不要なときにいつ抑制するかを知ることを期待しています。彼らはそうする。

+0

しかし、例外をスローせずに参照型を表す汎用パラメータを受け入れます。その場合、 'T'から' object'へのキャストをサポートするためには、ノーオペレーションの動作が必要です。 – CodesInChaos

+0

それは有効な点です。ジッタは、Tが参照型であることを既に認識しており、ボクシング変換のコードを完全に省略している。 –

+0

通常の参照型で 'box'を使用したときに実際にスローされるかどうかチェックしましたか?おそらくJITterは例外スローコードに達する前にそのような場合にも最適化を行うでしょう。 – CodesInChaos

3

は、一般的な機能を考える:T自体に価値をボクシング、参照型である場合、この関数の期待される動作は何もしません

ldarg.1  
box   01 00 00 1B 
ret 

object MyBox<T>(T value) 
{ 
    return (object)value; 
} 

これはにコンパイル。

ボクシング参照型として知られている値はそれほど有用ではありませんが、ジェネリックスと一貫性のある方法で指定するのは簡単で一貫性があります。