问:在下面的示例中,n
是值还是引用?
dynamic n = (int)2;
默认情况下,除非另有说明:
类实例和数组是引用类型。
POD类型和可能的结构是值类型。
从概念上讲,上面的值可以被认为是动态POD类型"或者包含POD"的动态类型,无论哪种方式都不明显以上规则应适用,如果它们都适用,这可能会导致矛盾。
对我来说,dynamic
感觉好像它应该像它所持有的值一样,或者是一个引用类型。
答案 0 :(得分:4)
dynamic
与object
相同。实际上,如果您使用反编译器(例如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"。因此,在为动态变量分配值类型时,值类型的行为类似于值类型,从而生成副本。但是当你使用动态变量时,它就像一个引用类型,只在分配给另一个动态变量时复制引用。