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

Mir*_*ria 3 .net c# generics boxing

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

Jon*_*eet 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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我们去了 - 铸造并没有死.

同样,在编译时你不知道确切类型并且不能一般地表达它的情况下仍然会发生装箱.最明显的两个例子是:

  • 反射(用反射获取属性的值将给你一个object,必要时装箱)
  • C#4中的动态类型:

    dynamic d = CreateDynamicObject();
    int x = d.Foo(); // The dynamic call would have to box if necessary,
                     // the conversion will unbox
    
    Run Code Online (Sandbox Code Playgroud)

所以拳击也没死.

如果你只是谈论在集合中存储值,那么拳击和转换现在在代码中出现的次数确实比以前少得多.但并非所有东西都在集合中,而且泛型在集合之外也是有用的.