修改动态类型的“盒装”变量的值是否会创建隐式副本?

时间:2015-04-02 16:26:18

标签: c# dynamic struct reference

当我读到C#' dynamic实际上是reference type时,我想到了这一点。

所以我掀起了这样的事情:

struct ValueType
{
    public int test;
}

public class Test
{
    public static void modifier(dynamic variable)
    {
        variable.test = 10;
    }

    public static void Main()
    {
        ValueType valTypeVar = new ValueType();
        valTypeVar.test = 1;
        System.Console.WriteLine(valTypeVar.test);
        modifier(valTypeVar);
        System.Console.WriteLine(valTypeVar.test);
    }
}

打印

1
1

虽然我期望它打印

1
10

为什么上面的代码没有按预期工作?该变量肯定已装箱,因此variable.test = 10;无法评估为( (ValueType)variable ).test。幕后发生了什么? variable是否隐式复制到新的变量实例,然后进行修改?如果是这样,当它传递class引用类型时也会发生吗?

此外,如果上述情况属实,那么为什么dynamic被认为是一种引用类型,当它实际上似乎随意采用值类型和引用类型的语义时,即可以是值类型或引用 - 类型?是不是它通过引用传递给方法然后只是一个实现细节?

1 个答案:

答案 0 :(得分:3)

当你致电modifier时,你确实是拳击valTypeVar。然后你正在改变那个盒装价值。

您将valTypeVar的值复制到一个盒装值中并将该盒装值变为当然不会改变valTypeVar中的值。