C#动态POD是值还是引用类型?

时间:2016-02-01 15:57:35

标签: c# dynamic reference value-type reference-type

问:在下面的示例中,n是值还是引用?

dynamic n = (int)2;

默认情况下,除非另有说明:

  • 类实例和数组是引用类型。

  • POD类型和可能的结构是值类型。

从概念上讲,上面的值可以被认为是动态POD类型"或者包含POD"的动态类型,无论哪种方式都不明显以上规则应适用,如果它们都适用,这可能会导致矛盾。

对我来说,dynamic感觉好像它应该像它所持有的值一样,或者是一个引用类型。

3 个答案:

答案 0 :(得分:4)

dynamicobject相同。实际上,如果您使用反编译器(例如ILDasm),您将看到

  object n = 2

或者如果您更喜欢IL代码

.locals init (
    [0] object
)

IL_0000: nop
IL_0001: ldc.i4.2
IL_0002: box [mscorlib]System.Int32
IL_0007: stloc.0

所以n是对象,它是一个引用类型。是的,你有拳击在这里。甚至C#规范也说动态可以被认为与对象相同(4.7动态类型):

  

动态被认为与对象相同,除了以下内容   尊重:

     

•动态类型表达式的操作可以动态绑定(第7.2.2节)。

     

•类型推断(第7.5.2节)如果两者都是候选者,则更喜欢动态优先于对象。

答案 1 :(得分:-1)

令人愉快的是,他们似乎是他们持有的那种类型。

dynamic n = (int)2;

is值类型。

dynamic n = new int[0];

is参考类型。

dynamic n = 4;
bool b = n is ValueType; // true
n = new int[0];
b = n is ValueType; // false

有关使用struct成员而不使用NineBerry的其他类型示例,请参阅is的答案。

答案 2 :(得分:-1)

考虑这个例子:

struct TestStruct
{
    public int Value;
}

private void button1_Click(object sender, EventArgs e)
{
    TestStruct lOriginal = new TestStruct();
    lOriginal.Value = 42;

    dynamic n = lOriginal;
    dynamic m = n;

    lOriginal.Value = "4711"
    MessageBox.Show(m.Value.ToString());

    n.Value = 4711;
    MessageBox.Show(m.Value.ToString());
}

第一个输出是" 42"。第二个输出是" 4711"。因此,在为动态变量分配值类型时,值类型的行为类似于值类型,从而生成副本。但是当你使用动态变量时,它就像一个引用类型,只在分配给另一个动态变量时复制引用。