在什么情况下拳击会在现代C#中出现?

时间:2017-05-11 11:08:28

标签: c# boxing

我正试图向一位初级同事解释拳击。

规范示例似乎是ArrayList。例如:

但是,当引入泛型时,这已被C#2中的List<T>取代(如this answer中所述)。

那么,在仿制药的时代,在什么情况下我会发现自己的拳击价值?

编辑:要清楚,我不是在问是否仍然可以使用拳击。我问为什么我们会使用拳击,因为泛型使ArrayList过时了。

编辑2:我认为这已经很明确了,但我也没有问过ArrayListList<T>之间的区别。事实上,这个问题完全取决于我理解泛型意味着我们不必使用ArrayList,因此我们不需要在这些情况下设置值。

2 个答案:

答案 0 :(得分:3)

拳击和拆箱不是你明确做的事情;只要你手中有struct并且你将它传递给期望object的接收器,它就会一直发生。所以,请考虑以下代码:

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

SafeToString( 42 );

如果您说过42.ToString()则没有装箱,因为编译器知道42有ToString()方法,struct不能被子类化,所以{{1在编译时已知在42上运行的方法。

然而,当你说ToString()时,42被装入一个对象,该对象被传递给SafeToString( 42 );,后者调用SafeToString(),后者解析为装箱对象的Object.ToString() ,代表ToString()

答案 1 :(得分:2)

泛型是一件好事,但他们无法完全消除处理拳击的必要性。

ArrayList已经过时了,但是有时你仍然会在一个列表中存储不同的类型时使用List<object>(当只有Object是他们共同的东西时)。

另一个通用方法示例。同样,如果您在编译时知道类型,它们也很好,但是如果您想要使用任何类型的东西怎么办?好的旧object参数和拳击(用铸造)来救援。