在数组setter / setter中使用adressed索引

时间:2018-01-28 10:15:11

标签: c# arrays getter-setter

我想正确处理数组的getter和setter中的索引(不是异常处理程序),就像这样(这不起作用):

byte[] Board {
    get {
        if (index >= 0 && index < Board.Length)
            return Board[index];
        else
            return 3;
    }
    set {
        if (index >= 0 && index < Board.Length)
            Board[index] = value;
    }
}

这样,例如Board[1]返回Board [1]的内容,Board[-1]返回3.

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

你不能用setter和getter来做到这一点。

解决方法是创建一个名为Array<T>的数组包装类。添加T[]类型的字段作为&#34;支持字段&#34;。然后实现T[]的所有成员,例如LengthIEnumerable<T>接口。例如,

class Array<T> {
    T[] _array;

    public int Length => _array.Length;

    public Array(int length) {
        _array = new T[length];
    }
}

这是重要的部分,您现在可以为数组包装器添加索引器:

public T this[int index] {
    get {
        if (index >= 0 && index < _array.Length) {
            return _array[index];
        } else {
            return 3;
        }
    }
    set {
        if (index >= 0 && index < _array.Length) {
            _array[index] = value;
        }
    }
}

然后,您可以使用Array<byte>作为董事会的类型。

答案 1 :(得分:1)

在C#中,属性只能获取/设置&#34;自己&#34;。这意味着如果你有一个数组,你只能获取/设置数组本身,而不是单个值。但是,您可以创建以您想要的方式查找和操作的方法:

public byte getBoardValue(int index) {
  if (index >= 0 && index < Board.Length)
    return _board[index];
  else
    return 3;
}

public void setBoardValue(int index, byte value) {
  if (index >= 0 && index < Board.Length)
        _board[index] = value;
}