当我读到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
被认为是一种引用类型,当它实际上似乎随意采用值类型和引用类型的语义时,即可以是值类型或引用 - 类型?是不是它通过引用传递给方法然后只是一个实现细节?
答案 0 :(得分:3)
当你致电modifier
时,你确实是拳击valTypeVar
。然后你正在改变那个盒装价值。
您将valTypeVar
的值复制到一个盒装值中并将该盒装值变为当然不会改变valTypeVar
中的值。