C# 如果在Get访问器中设置值,则返回属性中的数组

C# 如果在Get访问器中设置值,则返回属性中的数组,c#,arrays,properties,C#,Arrays,Properties,两个问题: 我经常发现自己在get访问器中设置属性的值(如上所示),而不是使用set访问器。通过这种方式,我确保每当有人要求提供值时,他们都会得到一个更新版本。这样做一般可以吗 我意识到在属性中返回数组不是一个好的做法(),但我担心如果我返回一个ReadOnlyCollection,那么每次有人要求更新值时,我都必须创建一个新的实例,同时创建一个float(见下文)。在我的程序中,每秒会有几次这样的要求,所以就性能而言,这似乎是不明智的。在我的例子中,忽略这个规则可以吗,因为实际上每次用户请求时

两个问题:

  • 我经常发现自己在get访问器中设置属性的值(如上所示),而不是使用set访问器。通过这种方式,我确保每当有人要求提供值时,他们都会得到一个更新版本。这样做一般可以吗

  • 我意识到在属性中返回数组不是一个好的做法(),但我担心如果我返回一个ReadOnlyCollection,那么每次有人要求更新值时,我都必须创建一个新的实例,同时创建一个float(见下文)。在我的程序中,每秒会有几次这样的要求,所以就性能而言,这似乎是不明智的。在我的例子中,忽略这个规则可以吗,因为实际上每次用户请求时都会设置该值(因此,如果有人覆盖数组,我们就不会有问题)

  • 使用ReadOnlyCollection:

    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;
        }
    }
    
    private ReadOnlyCollection\u位置;
    公共玩家()
    {
    }
    公共只读集合位置
    {
    得到
    {
    _location=new ReadOnlyCollection(新float[]{Worker.Elements[“lbXCoordinate”].Value,Worker.Elements[“lbXCoordinate”].Value,Worker.Elements[“lbXCoordinate”].Value});
    返回位置;
    }
    }
    
    您可以返回一个
    IReadOnlyCollection
    ,因为数组实现了这个接口

    这是有效代码:

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

    ReadOnlyCollection
    不是一个接口。这是一节课,谢谢!我确实有不同的线程访问它。那会是什么样的同步呢?如果我让你的位置不稳定就够了吗?我真的不在乎不同的线程是否最终具有不同的位置值,因为我的想法是,无论谁请求,都应该具有最新的值。如果我错过了同步的关键点,请道歉。谢谢!我会去读线程同步。简单地说,如果我不关心不同的线程得到不同的值,为什么我需要同步呢?我是说,毕竟他们应该这么做。当字符移动时,它的位置改变,所以一个线程一个接一个地询问会得到一个差异值。我不确定这是否是你的应用程序的一个问题,但是考虑一下:写线程已经写X和Y。然后它被读线程中断,读取X,Y,Z.,在这种情况下Z是一个过时的值。我猜这不是问题,因为你经常更新(写)。啊,明白了。这个特殊的代码似乎没有锁是安全的,对吗?就像有人调用instance.Location一样,它在读取之前直接写入(如上面的代码所示)。因此,如果它被中断,那么读取就永远不会完成。因此,它要么获取IReadOnlyCollection中的所有X、Y、Z坐标,要么什么也得不到(如果它被中断)。对吗?
    private  _location[] = new float[3];
    
    public IReadOnlyCollection<float> Location
    {
        get
        {
            return _location;
        }
    }
    
    get
    {
       lock(Worker.Elements)
       {
          _location[0] = Worker.Elements["lbXCoordinate"].Value;
          _location[1]= Worker.Elements["lbYCoordinate"].Value;
          _location[2] = Worker.Elements["lbZCoordinate"].Value;
    
          return _location;
       }       
    }