C# 是否修改“a”的值;盒装“;动态类型的变量是否创建隐式副本?
当我读到C#的C# 是否修改“a”的值;盒装“;动态类型的变量是否创建隐式副本?,c#,dynamic,struct,reference,C#,Dynamic,Struct,Reference,当我读到C#的动态实际上是一个 所以我做了这样的事情: struct ValueType { public int test; } public class Test { public static void modifier(dynamic variable) { variable.test = 10; } public static void Main() { ValueType valTypeVar = n
动态
实际上是一个
所以我做了这样的事情:
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)变量进行计算。test
。幕后发生了什么?variable
是否隐式复制到一个新的变量实例,然后对其进行修改?如果是这样,当传递给它一个类
引用类型时是否也会发生这种情况
此外,如果上述情况属实,
dynamic
为什么被视为一种引用类型,而它实际上似乎可以随意使用值类型和引用类型的语义,即可以是值类型或引用类型?它通过引用传递给方法这一事实难道不只是一个实现细节吗?当您调用modifier
时,您确实在装箱valTypeVar
。然后,您将对该装箱值进行变异
您将
valTypeVar
的值复制到一个装箱值中并对装箱值进行了变异,这一事实当然不会在调用modifier
时对valTypeVar中的值进行变异。然后,您将对该装箱值进行变异
您将valTypeVar
的值复制到一个装箱值中并对装箱值进行了变异,这一事实当然不会在调用modifier
时对valTypeVar中的值进行变异。然后,您将对该装箱值进行变异
您将valTypeVar
的值复制到一个装箱值中并对装箱值进行了变异,这一事实当然不会在调用modifier
时对valTypeVar中的值进行变异。然后,您将对该装箱值进行变异
您将valTypeVar
的值复制到一个装箱值中,并对装箱值进行了变异,这一事实当然不会使valTypeVar
中的值发生变异,但我的猜测是-dynamic
是一种错觉。它会向您和编译器隐藏实际发生的事情,直到它实际发生为止。因此,在运行时,所有内容都会被绑定和验证,并且您不会向方法发送动态数据,而是发送实际的值类型。因此,在这种情况下,它的行为与任何正常值类型一样。让我们看看我是否正确。dynamic是System.Object的语法糖。否则,它不会使值类型表现出不同的行为,它们仍然被装箱,并且您的代码仍然只是更新装箱副本。这段代码只有在使用类的情况下才能工作。不确定,但我猜--dynamic
是一种错觉。它会向您和编译器隐藏实际发生的事情,直到它实际发生为止。因此,在运行时,所有内容都会被绑定和验证,并且您不会向方法发送动态数据,而是发送实际的值类型。因此,在这种情况下,它的行为与任何正常值类型一样。让我们看看我是否正确。dynamic是System.Object的语法糖。否则,它不会使值类型表现出不同的行为,它们仍然被装箱,并且您的代码仍然只是更新装箱副本。这段代码只有在使用类的情况下才能工作。不确定,但我猜--dynamic
是一种错觉。它会向您和编译器隐藏实际发生的事情,直到它实际发生为止。因此,在运行时,所有内容都会被绑定和验证,并且您不会向方法发送动态数据,而是发送实际的值类型。因此,在这种情况下,它的行为与任何正常值类型一样。让我们看看我是否正确。dynamic是System.Object的语法糖。否则,它不会使值类型表现出不同的行为,它们仍然被装箱,并且您的代码仍然只是更新装箱副本。这段代码只有在使用类的情况下才能工作。不确定,但我猜--dynamic
是一种错觉。它会向您和编译器隐藏实际发生的事情,直到它实际发生为止。因此,在运行时,所有内容都会被绑定和验证,并且您不会向方法发送动态数据,而是发送实际的值类型。因此,在这种情况下,它的行为与任何正常值类型一样。让我们看看我是否正确。dynamic是System.Object的语法糖。否则,它不会使值类型表现出不同的行为,它们仍然被装箱,并且您的代码仍然只是更新装箱副本。只有在使用类时,此代码才能工作。