通过引用检索属性

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吗?

Mar*_*ell 6

没有; 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)