原文链接: 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来解决