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

时间:2015-08-03 04:35:49

标签: c# dynamic casting boxing

考虑以下代码......

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

......不是我要问的。在我的示例中,我在动态中存储了一个对象,因此不需要装箱,但是当我访问该对象上的值类型属性时,该值类型属性是否装箱?希望能够清除我在此之后所做的事情。

1 个答案:

答案 0 :(得分:0)

我引自this msdn文件:

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

所以

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

不会打拳击。

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

int y = dynamicValueHolder.HeldValue;

意味着取消装箱。