阅读 John Sharp 的书 VS 2010,它说泛型允许消除强制转换的需要,减少值类型的装箱 - 减少?我认为它被删除以及铸造?谁能解释一下?
问问题
544 次
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 回答