1. 程式人生 > >《隨筆十四》——C#中的 “ 陣列中有用的屬性 和 方法 ”

《隨筆十四》——C#中的 “ 陣列中有用的屬性 和 方法 ”

目錄

Clone 方法


●   C# 陣列從 System.Array 類繼承, 它們可以從基類繼承很多有用的屬性和方法,如圖:

namespace HelloWorld_Console
{
  
    class Program
    {
        static void PrintArray(int []a)
        {
            foreach (var x in a)
            {
                Write($"\n{x}");
              
            }
           
        }
        static void Main(string[] args)
        {
            int[] arr = new int[] { 15, 20, 5, 25, 10 };
            PrintArray(arr);
            WriteLine();

            Array.Sort(arr);
            PrintArray(arr);
            WriteLine();

            Array.Reverse(arr);
            PrintArray(arr);

            WriteLine();
            WriteLine($" Rank = {arr.Rank}, Length = {arr.Length}");
            WriteLine($"GetLength = {arr.GetLength(0)}");
            WriteLine($"GetType = {arr.GetType()}");
            ReadKey();
        }
    }
}


輸出結果為:


15
20
5
25
10

5
10
15
20
25

25
20
15
10
5
 Rank = 1, Length = 5
GetLength = 5
GetType = System.Int32[]

 


Clone 方法


Clone 方法為陣列進行淺複製,也就是說,它只建立了陣列本身的克隆。 對於型別陣列和引用型別陣列而言,有不同的結果。

克隆值型別陣列會產生兩個獨立陣列。

克隆引用型別陣列會產生指向相同物件的兩個陣列。

那麼Clone  方法返回 Object 型別的引用, 它必須被強制轉換成陣列型別。

下列程式碼克隆一個值型別陣列的示例,它產生了兩個獨立的陣列:

namespace HelloWorld_Console
{
  
    class Program
    {
      
        static void Main(string[] args)
        {
           int [] intArr1 = { 1, 2, 3 };
            int[] intArr2 = (int[])intArr1.Clone();
            WriteLine("輸出intArr2陣列中的值:");
            foreach (var tt in intArr2)
            {
                WriteLine(tt);
            }
            for (int i=0;i<intArr2.Length;++i)
            {
                intArr2[i] *= 100;
            }
            WriteLine("輸出改變intArr2陣列中的值:");
            foreach (var tt in intArr2)
            {
                WriteLine(tt);
            }
            ReadKey();
        }
    }
}

輸出結果為:

輸出intArr2陣列中的值:
1
2
3
輸出改變intArr2陣列中的值:
100
200
300

克隆引用型別陣列時, 這兩個陣列都會指向相同的物件。

namespace HelloWorld_Console
{
    class A
    {
        public int Value = 5;
    }
    class Program
    {
        static void Main(string[] args)
        {
            A[] AArray1 = new A[3] { new A(), new A(), new A() };
            WriteLine("先輸出AArray1的值:");
            foreach(var tt in AArray1)
            {
                WriteLine(tt.Value);
            }

            A[] AArray2 = (A[])AArray1.Clone();
            WriteLine("再輸出AArray2的值:");
            foreach (var tt in AArray1)
            {
                WriteLine(tt.Value);
            }
            WriteLine("再輸出AArray2的改變後的值:");
            for (int i=0;i<AArray2.Length;++i)
            {
                AArray2[i].Value = i+1;
                AArray2[i].Value *= 100;
                WriteLine(AArray2[i].Value);
            }
            ReadKey();
        }
    }
}


輸出結果為:

先輸出AArray1的值:
5
5
5
再輸出AArray2的值:
5
5
5
再輸出AArray2的改變後的值:
100
200
300