Point的属性在.net中

时间:2010-08-11 08:20:11

标签: c# .net

你们觉得什么更好?

private Point location;

public int LocationX { get { return location.X; } }
public int LocationY { get { return location.Y; } }

private Point location;

public Point Location { get { return location; } }

第二种方法的问题是XY都可以被类'客户端变异,在这种情况下,这不是我想要的。我应该在Point周围创建一个包装器,这样我就可以返回一个不可变的Point

由于

3 个答案:

答案 0 :(得分:6)

我更喜欢第二种方法,因为X和Y成员不可变(Point是结构,因此是值类型)。 也就是说,您无法更改位置,因为您无法修改类的Location属性的X或Y属性,因为Point是值成员。如果要更改它,则必须实例化一个新的Point实例。

请看下面的示例,编译器将阻止您更改Location属性的X或Y成员:

class Program
{
    private class MyType
    {
        private readonly Point _location;

        public MyType(Point location)
        {
            _location = location;
        }

        public Point Location
        {
            get
            {
                return _location;
            }
        }
    }

    static void Main( string[] args )
    {
        var someInstance = new MyType (new Point (5, 6));

        someInstance.Location.X = 5; // <- compiler error: cannot modify the expression because it is not a variable.
    }

答案 1 :(得分:2)

  

可以通过类'client,

来突变X和Y.

如果Point是一个结构(它应该是),这不是问题。客户只能获得一份副本。

  

你们觉得什么更好?

对于一个体面的,不可变的值类型Point,单个属性就可以了。 \

如果这是关于System.Drawing.Point的,请将其隐藏起来。一个包装器可能但是完全替换呢?

答案 2 :(得分:0)

Law of Demeter在.NET世界中并没有太多的爱,但是如果你担心可变性,它可能是第一个选项的一个很好的额外理由。