修改动态类型的 "boxed" 变量的值是否会创建隐式副本?
Does modifying the value of a "boxed" variable of the dynamic type create an implicit copy?
当我读到 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
被认为是引用类型,因为它实际上似乎随意采用值类型和引用类型的语义,即可以是值类型或参考类型?它通过引用传递给方法的事实不只是一个实现细节吗?
当你叫modifier
时,你确实在打拳valTypeVar
。然后你正在改变那个装箱的值。
您将 valTypeVar
的值复制到装箱值并改变装箱值的事实当然不会改变 valTypeVar
中的值。
当我读到 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
被认为是引用类型,因为它实际上似乎随意采用值类型和引用类型的语义,即可以是值类型或参考类型?它通过引用传递给方法的事实不只是一个实现细节吗?
当你叫modifier
时,你确实在打拳valTypeVar
。然后你正在改变那个装箱的值。
您将 valTypeVar
的值复制到装箱值并改变装箱值的事实当然不会改变 valTypeVar
中的值。