你们觉得什么更好?
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; } }
第二种方法的问题是X
和Y
都可以被类'客户端变异,在这种情况下,这不是我想要的。我应该在Point
周围创建一个包装器,这样我就可以返回一个不可变的Point
?
由于
答案 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世界中并没有太多的爱,但是如果你担心可变性,它可能是第一个选项的一个很好的额外理由。