C#编程(三十四)----------数组作为参数

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

原文地址:https://www.cnblogs.com/FinleyJiang/p/7602571.html