2017-05-11 2 views
3

私はジュニアの同僚にボクシングを説明しようとしています。現代のC#でボクシングが起こるのはどんな状況ですか?

標準的な例は、ArrayListと思われます。例えば:

しかし(this answerで説明したように)、これはジェネリックが導入されたときに、C#2からList<T>に置き換えられました。

だから、ジェネリックの時代、どのような状況で私は自分のボクシングの価値を見つけるだろうか?


編集:明確にするために、私はボクシングを使用することは可能であるかどうかを尋ねていませんよ。私はジェネリックがArrayListを時代遅れにした今、ボクシングを使う理由を尋ねています。


編集2:私は、これはすでに明らかだと思ったが、私はまたArrayListList<T>の違いについて尋ねていませんよ。実際、この問題は、ジェネリックスがArrayListを使用する必要がないということを私が感謝していることを完全に前提としているため、このような状況では値をボックスする必要はありません。

+2

これを行うと、 'object x =(object)24;'、あなたはボックス化されました。 –

+1

何も変わっていません - 条件は同じです –

+0

私の編集を見てください - 私はどのようにボックスに依頼していない、またはそれがまだ可能かどうかを尋ねています。私は最近誰かがボックスになるのかと尋ねています。 –

答えて

3

ボクシングとアンボクシングは、あなたが明示的に行うことではありません。あなたの手にstructがあり、それをobjectと予想している受信者に渡しているときはいつも何かが起こります。だから、このコードを考えてみます。

public void SafeToString(Object a) 
{ 
    if(a != null) 
     return a.ToString(); 
    return "null"; 
} 

SafeToString(42); 

あなたは42がToString()方法を有することがコンパイラによって知られており、structをサブクラス化することはできませんので42.ToString()は、何のボクシングはないだろうと述べていた場合、その上で動作ToString()方法42はコンパイル時に知られています。しかし

、あなたはSafeToString(42); 42はint.ToString()にボクシングのオブジェクトのToString()、その代表者に解決Object.ToString()を呼び出すSafeToString()に渡されるオブジェクト、、、に箱入りますと言います。

+0

こんにちはマイク。この回答に感謝します。あなたが気にしないことを願っていますが、私はちょうど公表したブログでそれを引用しています:http://blog.tdwright.co.uk/2017/05/12/what-is-boxing-and-why-あなたのケア/ –

+0

@トムウィル私は誇りに思った、ありがとう! C - := –

2

ジェネリックスは良いことですが、ボクシングを扱う必要性を完全に排除することはできません。

ArrayListは廃止されていますが、List<object>を別のタイプを1つのリストに保存するときに使用することもあります(Objectは共通しています)。

一般的な方法のもう1つの例。コンパイル時にタイプを知っていれば良いですが、どのタイプでも動作するものがあればどうですか?良い古いobjectパラメータと救助へのボクシング(キャスティング)。

+0

この答えをありがとう。私はあなたが気にしないことを願っていますが、私はちょうど今公開したブログ記事でこれを参照しました:http://blog.tdwright.co.uk/2017/05/12/what-is-boxing-and-why-あなたはケア/ –

関連する問題