c# - 泛型如何消除或减少装箱的需要?

标签 c# .net generics boxing

阅读 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;
    ...
}

开始吧 - 转换还没有结束。

同样,装箱仍然会发生,在您在编译时不知道确切类型并且无法通用地表达它的情况下。两个最明显的例子是:

  • 反射(通过反射获取属性的值将为您提供一个对象,必要时进行装箱)
  • C# 4 中的动态类型:

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

所以拳击也没有死。

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

关于c# - 泛型如何消除或减少装箱的需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5645272/

相关文章:

c# - C# 中的 LINQ 问题

c# - ASP.NET:CS1519:类、结构或接口(interface)成员声明中的无效标记 'this'

c# - Dtcping 测试通过但仍然有 Communication with the underlying transaction manager has failed

c# - 在 C# 中计算多语言字符串长度以存储在 Oracle VARCHAR2 字段中

.net - 相当于 OSX 上使用 Mono 的 Windows 服务

c# - 如何比较两个 List<String> ?

c# - 包含 silverlight 控件的母版页

java - 原始类型。对泛型类型的引用应该被参数化

java - 为什么 HibernateTemplate 中的 findXXX() 方法返回非参数化列表?

java - 实例不工作?