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來解決


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM