当访问存储在动态对象中的值类型属性时,是否会导致这些属性的装箱?值

本文关键字:属性 是否 对象 动态 存储 访问 类型 | 更新日期: 2023-09-27 18:05:57

考虑以下代码…

public class ValueHolder<T>
{
    public T HeldValue{ get; set; }
}

在这里赋值x时,当然没有装箱。

var intValueHolder = new ValueHolder<int>(){ HeldValue = 44 };
int x = intValueHolder.HeldValue;

但是在这种情况下ValueHolder存储在一个动态的?当分配HeldValue给y时是否有装箱?

dynamic dynamicValueHolder = new ValueHolder<int>(){ HeldValue = 44 };
int y = dynamicValueHolder.HeldValue;

我不确定动态成员分辨率的机制是什么,所以我不确定如何检查这个

注意

我是不是在动态中存储值类型,所以像这样的例子…

dynamic x = 44; // 44 is boxed

…不是我想问的在我的例子中,我将对象存储在动态中,因此不需要装箱,但是当我访问该对象的值类型属性时,该值类型属性是装箱的吗?希望这能澄清我要讲的内容

当访问存储在动态对象中的值类型属性时,是否会导致这些属性的装箱?值

我从msdn文档中引用:

"在大多数情况下,动态类型的行为类似于对象类型。但是,编译器不会解析或检查包含动态类型表达式的操作。编译器将有关操作的信息打包在一起,这些信息稍后用于在运行时计算操作。作为这个过程的一部分,动态类型的变量被编译成对象类型的变量。因此,动态类型只存在于编译时,而不存在于运行时。"

dynamic dynamicValueHolder = new ValueHolder<int>(){ HeldValue = 44 }; 

将不处理拳击。

但是动态编译类似于object, object是一个引用类型。当创建引用类型时,它可以包含值类型属性,这些属性存储在堆上,因为它们是引用类型的一部分(有关更多信息,请参阅c-sharpcorner文章)。

int y = dynamicValueHolder.HeldValue;

意味着拆箱。