gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:36:23 27 4
gpt4 key购买 nike

考虑以下代码...

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

这里给x赋值的时候,当然没有装箱。

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

但是在这种情况下,如果 ValueHolder 存储在动态中呢?给 y 赋值 HeldValue 有没有装箱?

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

我不确定动态成员解析的确切机制是什么,所以我不确定如何检查它。

注意

在动态中存储一个值类型,所以像这样的例子......

dynamic x = 44; // 44 is boxed

...不是我要问的。在我的示例中,我将一个对象存储在动态中,因此那里不需要装箱,但是当我随后访问该对象的值类型属性时,该值类型属性是否装箱?希望这能澄清我在这里的目的。

最佳答案

我引用自this msdn 文档:

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

所以

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

不会处理拳击。

但是 dynamic 像 object 一样被编译,而 object 是一个引用类型。创建引用类型时,它可以包含值类型属性,并且这些属性存储在堆中,因为它们是引用类型的一部分(有关更多信息,请参阅 this c-sharpcorner 文章。然后

int y = dynamicValueHolder.HeldValue;

表示拆箱。

关于c# - 当访问存储在动态中的对象的值类型属性时,是否会导致对这些属性的值进行装箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31779497/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com