3

阅读 John Sharp 的书 VS 2010,它说泛型允许消除强制转换的需要,减少值类型的装箱 - 减少?我认为它被删除以及铸造?谁能解释一下?

4

2 回答 2

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
    

所以拳击也没有死。

如果您只是在谈论将值存储在集合中,那么装箱和强制转换现在确实出现在代码中的频率比以前要少得多但并非所有东西都在集合中,泛型在集合之外也很有用。

于 2011-04-13T06:34:27.500 回答
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;
}
于 2011-04-13T06:45:08.313 回答