private readonly float[] _location;
public Player()
{
_location = new float[3];
}
public float[] Location
{
get
{
_location[0] = Worker.Elements["lbXCoordinate"].Value;
_location[1]= Worker.Elements["lbYCoordinate"].Value;
_location[2] = Worker.Elements["lbZCoordinate"].Value;
return _location;
}
}
两个问题:
我经常发现自己在 get Accessor中设置了一个Property的值(如上所示),而不是使用 set Accessor。通过这种方式,我确保每当有人要求提供价值时,他们都会获得更新版本。这通常可以吗?
我意识到在一个属性中返回一个数组并不是一个好习惯(link),但我担心如果我返回一个ReadOnlyCollection,那么我必须创建一个新的实例,每次有人要求更新值时都会浮动(见下文)。在我的程序中每秒会被要求几次,因此在性能方面似乎是不明智的。在我的情况下可以忽略这个规则是可以的,因为每次用户要求时都会设置该值(所以在有人碰巧覆盖数组的情况下我们不会遇到问题)?
使用ReadOnlyCollection:
private ReadOnlyCollection<float> _location;
public Player()
{
}
public ReadOnlyCollection<float> Location
{
get
{
_location = new ReadOnlyCollection<float>(new float[] {Worker.Elements["lbXCoordinate"].Value, Worker.Elements["lbXCoordinate"].Value, Worker.Elements["lbXCoordinate"].Value});
return _location;
}
}
答案 0 :(得分:1)
您可以返回IReadOnlyCollection<float>
,因为数组实现了此接口。
这是有效的代码:
private _location[] = new float[3];
public IReadOnlyCollection<float> Location
{
get
{
return _location;
}
}
关于getter中值的设置,这对我来说似乎没问题,因为开销可能很小。
如果不同的线程访问Worker.Elements
,您只需要确保一些同步。
为了确保返回一致的值,只要您尝试读取或写入此变量,就可以在Worker.Elements
上同步:
get
{
lock(Worker.Elements)
{
_location[0] = Worker.Elements["lbXCoordinate"].Value;
_location[1]= Worker.Elements["lbYCoordinate"].Value;
_location[2] = Worker.Elements["lbZCoordinate"].Value;
return _location;
}
}