.NET中点的属性

3
你们觉得什么更可取?
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吗?
谢谢

'Point' 是什么意思? - H H
1
@Henk Holtermann:Point 是一个结构,包含 X/Y 坐标。 - Bobby
第二个例子的属性返回一个整数 - 它不应该是Point吗? - Alex Humphrey
@Alex:您说得对。 - devoured elysium
3个回答

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.
    }

2

这意味着类的客户端可以对X和Y进行修改,

如果Point是一个结构体(应该是),这不是问题。客户端只会得到一个副本。

你们觉得哪个更好?

对于一个像素点(Point)这种拥有良好不变性的值类型,使用单一属性是可取的。如果这是关于System.Drawing.Point的话,最好封装起来。也可以考虑完全替换它。


0

德米特法则在.NET世界中并不受到太多关注,但如果您担心可变性,它可能是第一选项的一个很好的附加理由。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接