Mic*_*l Z 1 c# properties pass-by-reference
我是C#的新手.我来自Java世界.所以我对以下代码感到困惑:
class A
{
private PointF point;
public A(PointF point)
{
this.point = point;
}
public PointF Position
{
get { return point; }
}
}
Run Code Online (Sandbox Code Playgroud)
我想更改position属性的X坐标,所以我执行:
A a = new A(new PointF(1,2));
PointF p = a.Position;
p.X = 100;
Console.WriteLine(a.Position.X); // <--- I have 1 here!
Run Code Online (Sandbox Code Playgroud)
我想知道为什么输出不是100?据我了解,我已收到有关职位属性的私人领域的参考资料.我对吗?
我可以在不添加set-property的情况下更改属性并使用新的PointF对象传播Position吗?
没有; PointF是一个struct,所以它有复制语义而不是一个对象 ; 一旦你获得它 - 它是一个单独的和孤立的副本(除非你使用像ref/ out,这是......更微妙的东西).在您的示例中,实际上会多次复制该结构.
顺便说一句,这样做的结果是拥有可变结构实际上是一个非常糟糕的主意 - 所以在大多数情况下你应该避免你可以说的场景:
p.X = 100;
Run Code Online (Sandbox Code Playgroud)
因为这会导致更多的混乱而不是它有帮助.特别是以下内容完全无效:
a.Position.X = 100; // won't even compile
Run Code Online (Sandbox Code Playgroud)
(这里编译发现你正在改变一个只在变异期间存在的结构的副本,这意味着你的变化无处可去,几乎肯定是一个bug)