C#array accessiblity

时间:2015-04-25 19:36:10

标签: c# arrays

有没有办法防止重新初始化数组? (强制特定长度)

示例初始:

int[] array = new int[3]{0,0,0};

用法:

array = new int[5]{1,2,3,4,5};

以上用法将重新初始化长度为5的数组。

数组将始终具有3个元素,但元素的值将始终在变化。

我试图避免执行以下操作来分配它的值:

array[0] = 1;
array[1] = 2;
array[2] = 3;

4 个答案:

答案 0 :(得分:2)

尝试声明readonly

readonly int[] array = new int[3]{0,0,0};

答案 1 :(得分:2)

我不确定这是否是您想要的,但我可以向您推荐以下包装类:

public class FixedArrayHolder<T>
{
    public FixedArrayHolder(Int32 fixedLength, T[] array)
    {
        if (fixedLength < 0)
            throw new ArgumentOutOfRangeException();
        if (array == null)
            throw new ArgumentNullException();

        this.FixedLength = fixedLength;
        this.Array = array;
    }

    public Int32 FixedLength
    {
        get;
        private set;
    }

    private T[] m_array;

    public T[] Array
    {
        get
        {
            return this.m_array;
        }
        set
        {
            if (value == null)
                throw new ArgumentNullException();
            if (value.Length != this.FixedLength)
                throw new ArgumentException();

            this.m_array = value;
        }
    }

    public static implicit operator T[](FixedArrayHolder<T> fixedArray)
    {
        if (fixedArray == null)
            return null;

        return fixedArray.Array;
    }
}

您可以使用此类代替标准数组:

// Works
var array = new FixedArrayHolder<Int32>(3, new Int32[] { 1, 2, 3 });

// Works
array.Array = new Int32[] { 3, 4, 5 };

// Fails
array.Array = new Int32[] { 1, 2, 3, 4 };

P.S。:您可以使用一些索引器和IEnumerable IList成员扩展它,以便在需要时允许更加简化的元素访问。

答案 2 :(得分:1)

private int[] origin = new int[3];
    public int[] Origin {
        get {  return origin;} 
        set{
            if (value.Length >3) throw new ArgumentOutOfRangeException();
            else origin = value;
        }
    }
  

不要暴露这个领域。把它作为财产。验证属性setter中的值。 - Sriram Sakthivel

这非常有效,谢谢!

答案 3 :(得分:0)

我认为你应该将数组封装在一个类中,从构造函数中实例化它。使用公共getter和私有setter来控制访问:

public int[] MyArray {
    get;
    private set;
}

小提琴:https://dotnetfiddle.net/ZsjrsN