泛型如何消除或减少装箱的需要

本文关键字:何消 泛型 | 更新日期: 2023-09-27 17:50:15

阅读John Sharp的书VS 2010,它说泛型允许消除对强制类型转换的需要,减少值类型的装箱-减少?我还以为它被移除了呢?有人能解释一下吗?

泛型如何消除或减少装箱的需要

它并没有完全取消对装箱和强制类型转换的使用…它只是大大减少了它们。有时候你确实比编译器更了解事物的类型。例如,假设您将相同的事件处理程序连接到许多按钮。使用:

并不是不合理的
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
    

所以拳击也没有消亡。

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

多年前帮助我掌握泛型的方法是考虑在以下情况下使用泛型:

向包含类型信息的方法添加参数

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