C#中更改1维数组的大小
模拟Visual Basic的ReDim语句,C#实现,仅支持1维数组。若不需要检查参数的合法性,则只要最后4行程序就可以了。请大家讨论一下,当传入的数组不是1维时,是抛出RankException异常,还是抛出ArgumentException异常(可以指明参数名)为好。
1using System;
2
3static Array ReDim(Array array, int newLength)
4{
5 if (array == null)
6 {
7 throw new ArgumentNullException("array");
8 }
9 if (array.Rank != 1)
10 {
11 // throw new RankException("要求1维数组。");
12 throw new ArgumentException("要求1维数组。", "array");
13 }
14 if (newLength < 0)
15 {
16 throw new ArgumentOutOfRangeException("newLength", "要求非负数字。");
17 }
18 if (newLength == array.Length) return array;
19
20 Type type = array.GetType().GetElementType();
21 Array newArray = Array.CreateInstance(type, newLength);
22 Array.Copy(array, 0, newArray, 0, Math.Min(array.Length, newLength));
23 return newArray;
24}
2
3static Array ReDim(Array array, int newLength)
4{
5 if (array == null)
6 {
7 throw new ArgumentNullException("array");
8 }
9 if (array.Rank != 1)
10 {
11 // throw new RankException("要求1维数组。");
12 throw new ArgumentException("要求1维数组。", "array");
13 }
14 if (newLength < 0)
15 {
16 throw new ArgumentOutOfRangeException("newLength", "要求非负数字。");
17 }
18 if (newLength == array.Length) return array;
19
20 Type type = array.GetType().GetElementType();
21 Array newArray = Array.CreateInstance(type, newLength);
22 Array.Copy(array, 0, newArray, 0, Math.Min(array.Length, newLength));
23 return newArray;
24}
看看以下3个构造函数也很有意思。不知是不是M$的疏忽,如此相似的3个异常,其构造函数的参数顺序竟不一致,实在让人无所适从。
1public ArgumentException (string message, string paramName);
2public ArgumentNullException (string paramName, string message );
3public ArgumentOutOfRangeException(string paramName, string message );
2public ArgumentNullException (string paramName, string message );
3public ArgumentOutOfRangeException(string paramName, string message );