第14章 數組[《.net框架程序設計》讀書筆記]
發表時間:2024-06-15 來源:明輝站整理相關軟件相關文章人氣:
[摘要]第十四章 數組.內容摘要: 本章討論了數組的方方面面,對于這種常用類型進行深入研究。 一、 數組簡介 三種類型:一維數組、多維數組、交錯數組(jagged aray)l 一維數組: Int32[] myIntegers; ...
第十四章 數組.
內容摘要:
本章討論了數組的方方面面,對于這種常用類型進行深入研究。
一、 數組簡介
三種類型:一維數組、多維數組、交錯數組(jagged aray)
l 一維數組:
Int32[] myIntegers;
myIntegers = new Int32[100];
l 多維數組:
Int32[,] myIntegers;
myIntegers = new Int32[100,100];
l 交錯數組:交錯數組不受CLS支持
Point[][] myPolygons = new Point[3][];
myPolygons[0] = new Point[10];
myPolygons[1] = new Point[20];
myPolygons[2] = new Point[30];
二、 System.Array
請參考.net framework sdk中相關描述
三、 數組轉型
l 兩數組必須有同樣的維數
l 兩數組中元素類型間存在隱式或顯式轉換
l 除使用Array.Copy()方法外,不允許將值類型數組轉換為其他類型數組(Array.Copy方法會根據需要進行強制類型轉換或裝箱操作)
Array.Copy()方法能夠執行的類型轉換如下:
l 將值類型轉換為引用類型,將Int32轉換為Object
l 將引用類型轉換為值類型,將Object轉換為Int32
l 拓寬(widen)CLR基類型,如將Int32轉換為Double
下面這個示例提供了一個反面教材(切勿效仿,后果自負!)了值類型的裝換:
using System;
//自定義一個值類型,該類型可以與Int32進行互轉換
struct MyAge
{
private Int32 m_nAge;
public MyAge(Int32 nAge)
{
this.m_nAge = nAge;
}
//轉換操作符
public static implicit operator MyAge(Int32 nAge)
{
return new MyAge(nAge);
}
public static explicit operator Int32(MyAge age)
{
return age.ToInt32();
}
public Int32 ToInt32()
{
return m_nAge;
}
public override string ToString()
{
return "Age : " + m_nAge;
}
}
public class ArrayTest
{
public static void Main()
{
Int32[] arrInt = new Int32[10];
for(int i = 0; i < arrInt.Length; i ++)
{
arrInt[i] = i;
}
MyAge[] arrAge = new MyAge[arrInt.Length];
Array.Copy(arrInt, arrAge, arrInt.Length);
foreach(MyAge age in arrAge)
{
Console.WriteLine(age.ToString());
}
}
}
/*運行結果
未處理的異常: System.ArrayTypeMismatchException: 不能將源數組類型分配給目標數組
類型。
at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationA
rray, Int32 destinationIndex, Int32 length)
at System.Array.Copy(Array sourceArray, Array destinationArray, Int32 length)
at ArrayTest.Main()
*/
注:1、上述代碼是不能運行的。雖然為值類型定義了轉換操作,但仍不滿足上述轉換條件,可見自定義的轉換操作不被Array.Copy()認可。
2、上述代碼中涉及到類型轉換操作符的應用,請參考讀書筆記第九章 方法
四、 數組傳遞與返回
注意事項:
l 為獲得對數組元素的深拷貝,要求每個元素都實現ICloneable接口。需要注意的是應在適當時候使用深拷貝操作(詳情請參見《c# primer》p185)
l 返回數組引用的方法若不含數組元素應該返回一個包含0個元素的數組而不是null
l 不在方法中返回類型內部的數組引用,而是重新構造一個深拷貝的數組返回。
五、 創建下限非0的數組
使用Array.CreateInstance()方法:
public static Array CreateInstance(Type elementType, int[] lengths, int[] lowerBounds);
elementType : 要創建的 Array 的 Type。
lengths : 一維數組,它包含要創建的 Array 的每個維度的大小
lowerBounds : 一維數組,它包含要創建的 Array 的每個維度的下限(起始索引)。
六、 快速數組訪問
要點:
l 使用非安全的代碼
l 使用指針訪問數組
l 可進行非安全數組操作的元素為數值基元類型、Boolean、枚舉類型或字段為上述類型的結構類型,或字段為上述結構類型的結構類型……(遞歸定義的結構類型)
如下面例程所示:
using System;
public class ArrSafe
{
unsafe public static void Main() //此處表明使用非安全代碼
{
Int32[] arr = new Int32[]{1,2,3,4,5};
fixed(Int32 *element = arr) //使用指針訪問
{
for(Int32 i = 0; i < arr.Length; i ++)
{
Console.WriteLine(element[i]);
}
}
}
}
七、 重新調整數組的長度
l 使用如下方法獲取創建新的數組長度(請參見.net framework sdk中的詳細描述)
創建使用從零開始的索引、具有指定 Type 和長度的一維 Array。
[C#] public static Array CreateInstance(Type, int);
創建使用從零開始的索引、具有指定 Type 和維長的多維 Array。維的長度在一個 32 位整數數組中指定。
[C#] public static Array CreateInstance(Type, params int[]);
創建使用從零開始的索引、具有指定 Type 和維長的多維 Array。維的長度在一個 64 位整數數組中指定。
[C#] public static Array CreateInstance(Type, params long[]);
創建使用從零開始的索引、具有指定 Type 和維長的二維 Array。
[C#] public static Array CreateInstance(Type, int, int);
創建具有指定下限、指定 Type 和維長的多維 Array。
[C#] public static Array CreateInstance(Type, int[], int[]);
創建使用從零開始的索引、具有指定 Type 和維長的三維 Array。
[C#] public static Array CreateInstance(Type, int, int, int);
l 然后使用Array.Copy()方法,將原來的數組拷貝到新數組中