如果在Get Accessor中设置值,则返回属性中的数组

时间:2014-08-26 13:00:25

标签: c# arrays properties

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 Accessor中设置了一个Property的值(如上所示),而不是使用 set Accessor。通过这种方式,我确保每当有人要求提供价值时,他们都会获得更新版本。这通常可以吗?

  2. 我意识到在一个属性中返回一个数组并不是一个好习惯(link),但我担心如果我返回一个ReadOnlyCollection,那么我必须创建一个新的实例,每次有人要求更新值时都会浮动(见下文)。在我的程序中每秒会被要求几次,因此在性能方面似乎是不明智的。在我的情况下可以忽略这个规则是可以的,因为每次用户要求时都会设置该值(所以在有人碰巧覆盖数组的情况下我们不会遇到问题)?

  3. 使用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;
        }
    }
    

1 个答案:

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