有没有办法防止重新初始化数组? (强制特定长度)
示例初始:
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;
答案 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;
}