c# - 所有 C# 强制转换都会导致装箱/拆箱

标签 c# .net clr boxing

我很想知道 C# 中的所有强制转换是否都会导致装箱,如果不是,所有强制转换都是代价高昂的操作吗?

示例取自 Boxing and Unboxing (C# Programming Guide)

    int i = 123;
    // The following line boxes i.
    object o = i;  

这一行显然会导致装箱(将 int 类型包装成一个对象)。 这是一项被认为代价高昂的操作,因为它会产生将被收集的垃圾。

来自 2 种不同类型的引用类型的强制转换怎么样?成本是多少?可以适当测量吗? (与前面的例子相比)

例如:

public class A
{
}

public class B : A
{
}

var obj = new B();
var obj2 = (A)obj; // is this an "expensive" operation? this is not boxing

最佳答案

I am curious to know if all conversions in C# result in boxing.

没有。只有装箱转换会导致装箱,因此得名“装箱转换”。装箱转换都是从值类型到引用类型的内置转换——要么是到值类型继承自的类,要么是到它实现的接口(interface)。 (或者通过协变或逆变引用转换实现与其实现的接口(interface)兼容的接口(interface)。)

are all conversions a costly operation?

没有。身份转换是零成本的,因为编译器可以完全忽略它们。

What are the costs of implicit and explicit reference conversions?

隐式引用转换 是零成本。编译器可以完全忽略它们。也就是说,从 Giraffe 转换为其基本类型 Animal,或将 Giraffe 转换为其实现的接口(interface)类型 IAmATallMammal,都是免费的。

显式引用转换涉及运行时检查,以验证引用确实引用了所需类型的对象。

运行时检查是否“昂贵”取决于您的预算。

can that cost be properly measured?

当然。确定与您相关的资源(例如时间),然后用秒表仔细测量您的时间消耗。

一个你没有问但可能应该问的问题:

What are the most expensive conversions?

用户定义的转换只不过是方法调用的语法糖;该方法可以像任何方法一样花费任意长的时间。

动态转换在运行时再次启动编译器;编译器可能会花费任意长的时间来执行类型分析,具体取决于您选择向其抛出的分析问题的难度。

关于c# - 所有 C# 强制转换都会导致装箱/拆箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9366251/

相关文章:

c# - 从多个单独列表中匹配 'pair up' 项目的最快非 LINQ 算法是什么?

c# - c++ exe如何定位c# dll?

c# - 数组中有多少元素不为空?

c# - 在 C# 中使用 System.Web.HttpUtility.HtmlEncode 向网站写入新行

.net - 如何使用 ADO.NET 和 Oracle 在一次调用中运行多个不同的 `insert` 语句?

.net - 您如何在 .Net 中设置单元测试项目?

c# - 如何从托管代码中调试未发布的 COM 引用?

.net - 我能找出一代垃圾收集器中的所有对象吗?

c# - StreamReader 与 MemoryStream.ToArray

.net - 带有文本文件的 Entity Framework (没有数据库!)