• 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来解决

  • 相关阅读:
    Day 50
    Spring Boot logging 配置及相关属性
    spring boot的项目名称问题
    spring boot的项目结构问题
    @RestController无法自动注入的问题
    mysql的模糊查询
    写点什么来为自己的过去和未来画个分隔符
    python学习随笔day2
    python学习随笔day1
    linux文件上传和下载
  • 原文地址:https://www.cnblogs.com/android-blogs/p/6598418.html
Copyright © 2020-2023  润新知