C#中的链接属性和意外结果

Jus*_*tin 2 .net c# struct properties value-type

我只是快速阅读了这篇文章(特别是关于他选择使用结构/字段而不是类/属性的原因)并看到了这一行:

属性的结果不是真正的l值,因此我们不能执行类似Vertex.Normal.dx = 0的操作.属性的链接会产生非常意外的结果.

他在谈论什么样的意外结果?

Eri*_*ert 5

我想补充dbemerlin的答案,这里的关键是Rico的注释,属性不是"左值",或者,正如我们在C#中称之为"变量".

为了改变一个可变结构(理想情况下,你不应该;可变结构通常会导致比它们解决的更多问题),你需要改变一个变量.这是一个变量什么 -一个存储位置,其内容改变.如果你有一个矢量类型的字段,你说

Foo.vector.x = 123;
Run Code Online (Sandbox Code Playgroud)

然后我们有一个值类型的变量 - 字段Foo.vector - 因此我们可以改变它的属性x.但是如果你有一个值类型的属性:

Foo.Vector.x = 123;
Run Code Online (Sandbox Code Playgroud)

属性不是变量.这相当于

Vector v = Foo.Vector;
v.x = 123;
Run Code Online (Sandbox Code Playgroud)

它会改变临时变量v,而不是任何支持该属性的存储位置.

如果放弃可变值类型,整个问题就会消失.要更改x,请使用新值创建一个新向量并替换整个内容:

Foo.Vector = new Vector(x, Foo.Vector.y);
Run Code Online (Sandbox Code Playgroud)

  • @Kragen,假设Vector是一个值类型,因此通过值*复制*,而不是通过引用*复制*的引用类型.这就是为什么值类型具有它们的名称.局部变量v是Foo.Vector的*副本*; 改变它只改变v. (2认同)