阅读约翰夏普的书VS 2010,它说仿制药允许消除铸造的需要,减少价值类型的装箱 - 减少?我认为它被删除以及铸造? 有人可以解释一下吗?
答案 0 :(得分:5)
它不会完全删除拳击和施法的用途......它只会大大减少它们。有时你做比编译器更了解事物的类型。例如,假设您已将相同的事件处理程序连接到许多按钮。使用起来并不合理:
public void HandleClickEvent(object sender, EventArgs e)
{
// We know it will always be a button, and we want an exception if it's not
Button button = (Button) sender;
...
}
我们去了 - 铸造并没有死。
同样拳击仍然会发生,在编译时你不知道确切的类型并且不能一般地表达它的情况下。最明显的两个例子是:
object
,必要时装箱)C#4中的动态类型:
dynamic d = CreateDynamicObject();
int x = d.Foo(); // The dynamic call would have to box if necessary,
// the conversion will unbox
所以拳击也没死。
如果你仅谈论在集合中存储值,那么拳击和转换现在出现在代码中,而且比以前更少。但并非所有东西都在集合中,而且泛型在集合之外也是有用的。
答案 1 :(得分:1)
多年前帮助我掌握仿制药的原因是考虑使用仿制药:
您将参数添加到包含类型信息的方法
public object Parse(string input, Type outputType)
// replace by:
public T Parse<T>(string input)
您使用包含类型信息的实例字段:
class Foo
{
private Type _wrappedObjectType;
private object _wrappedObject;
}
// replace by
class Foo<T>
{
private T _wrappedObject;
}