如果在获取访问器中设置值,则在属性中返回数组

本文关键字:属性 返回 数组 设置 获取 访问 如果 | 更新日期: 2023-09-27 18:19:24

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

两个问题:

  1. 我经常发现自己在get访问器中设置Property的值(如上所示),而不是使用set访问器。通过这种方式,我确保无论何时有人请求该值,他们都会得到更新的版本。这样做通常可以吗?

  2. 我意识到在属性中返回数组不是很好的实践(链接),但我担心,如果我返回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;
    }
}

如果在获取访问器中设置值,则在属性中返回数组

你可以返回一个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;
   }       
}