仿制药如何消除或减少对拳击的需求?

时间:2011-04-13 06:31:21

标签: c# .net generics boxing

阅读约翰夏普的书VS 2010,它说仿制药允许消除铸造的需要,减少价值类型的装箱 - 减少?我认为它被删除以及铸造? 有人可以解释一下吗?

2 个答案:

答案 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;
}