2011-04-13 48 views

回答

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 
    

所以拳击也没有死。

如果你只谈论收藏保存价值,那么它是真的,拳击和铸造现在出现在代码很多,很多的频率比以前多了。但并非所有产品都在集合中,泛型在集合之外也是有用的。

+0

谢谢乔恩,虽然我不是提前了解的第一个例子(事件)如何与泛型:/ – Miria 2011-04-13 06:43:59

+0

@Mi ria:不是,这恰恰就是要点:泛型不会解决每个*您可能想要投射或放入盒子/盒子的地方。这就是为什么仿制药只能减少铸造/装箱/拆箱的数量而不是完全消除它的原因。 – 2011-04-13 06:44:49

+0

哦,那么我可能会问错。我认为:使用泛型(只讲泛型代码)这个代码是不是免费的?为什么拳击只能减少? – Miria 2011-04-13 06:54:12

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