当访问存储在动态对象中的值类型属性时,是否会导致这些属性的装箱?值
本文关键字:属性 是否 对象 动态 存储 访问 类型 | 更新日期: 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;
意味着拆箱。