原文鏈接: http://blog.csdn.net/shanyongxu/article/details/46765267
數組作為參數
數組可以作為參數傳遞給方法,也可以從方法中返回.要返回一個數組,只需要把數組聲明為返回類型.
static void Main(string[] args)
{
int[] array = { 1, 2, 3, 4, 5, 6 };
PrintArray(new int[] { 1, 2, 3, 4, 5, 6, 7 });
PrintArray(array);
}
static void PrintArray(int[] arr)
{
foreach (var item in arr)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
返回一個數組:
static void Main(string[] args)
{
int[] array = GetArray(new int[] { 1, 2, 3, 4, 5, 6, 7 });
foreach (var item in array)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
static int [] GetArray(int[] arr)
{
return arr;
}
數組協變
數組支持協變,這表示數組可以聲明為基類,其派生類型的元素可以賦予數組元素.例如,可以聲明一個object[]類型的參數,給它傳遞一個Person[];
注意:數組協變只能用語音與類型,不能用於值類型.
數組協變有一個問題,它只能通過運行時異常來解決.如果把Person數組賦予object數組,object數組就可以使用派生自object的任何元素.例如,編譯器允許把字符串傳遞給數組元素,但因為object數組引用Person數組,所以會出現一個運行時異常.
ArraySegment<T>
static void Main(string[] args)
{
string[] array = {"zhangsan","lisi","wangwu","zhaoliu" };
//將該數組放到ArraySegment
ArraySegment<string> arrayStr = new ArraySegment<string>(array);
//只能用for輸出,不能使用foreach
for (int i = arrayStr.Offset; i < (arrayStr.Offset+arrayStr.Count); i++)
{
Console.WriteLine(" [{0}] : {1}",i,arrayStr.Array[i]);
}
//選取數組中的一段,從下標為1的元素開始,取3個.選取的結果為下標為1,2,3的元素
//ArraySegment<string> subArray = new ArraySegment<string>(array, 1, 3);
Console.ReadKey();
}
多個ArraySegment實例可以引用同一個原始數組,從而可能發生重疊.Array屬性返回整個原始數組.而不是該數組的副本.
所以使用: arrayStr.Array[2] = "hahaha";
數組是變成:zhangsan lisi hahaha zhaoliu
應用:ArraySegment可以用在內存碎片較多的地方,來減少內存碎片的產生,以便使內存碎片更有序,提高我們的程序性能.
比如Socket.BeginReceive異步接收頻繁的時候,我們並不知道要接受的這個buffer長度,所以就預先設置一個固定值,這時候這塊內存就會被pin住,一直等到網絡硬件接收到數據完成為止,這往往比較容易產生碎片,如果你用windbg一看,!DumpHeap -type Free -stat會有很多objects但是值都是0.所以可以用ArraySegment+Stack來解決