C# 数组(数组协变和数组继承的有用成员)
数组协变
在某些情况下,即使某个对象不是数组的基类型,也可以把它赋值给数组元素。这种属性叫
作数组协变(arraycovariance)。在下面的情况下可以使用数组协变。
- 数组是引用类型数组。
- 在赋值的对象类型和数组基类型之间有隐式转换或显式转换。
由于在派生类和基类之间总是有隐式转换,因此总是可以将一个派生类的对象赋值给为基类
声明的数组
例如,如下代码声明了两个类,A和B,其中B类继承自A类。最后一行展示了把类型B的
对象赋值给类型A的数组元素而产生的协变。图13-15演示了代码的内存布局。
说明值类型数组没有协变。
数组继承的有用成员
之前提到过,C#数组派生自System.Array类。它们可以从基类继承很多有用的属性和方法,
表13-1列出了其中最有用的一些。
例如,下面的代码使用了其中的一些属性和方法:
public static void PrintArray(int[] a)
{foreach(var x in a)Console.Write($"{x}");Console.WriteLine("");
}static void Main()
{int[] arr=new int[] {15,20,5,25,10};PrintArray(arr);Array.Sort(arr);PrintArray(arr);Array.Reverse(arr);PrintArray(arr);Console.WriteLine();Console.WriteLine($"Rank={arr.Rank},Length={arr.Length}");Console.WriteLine($"GetLength(0) ={arr.GetLength(0)}");Console.WriteLine($"GetType() ={arr.GetType()}");
}
Clone方法
Clone方法为数组进行浅复制,也就是说,它只创建了数组本身的克隆。如果是引用类型数
组,它不会复制元素引用的对象。对于值类型数组和引用类型数组而言,这有不同的结果。
- 克隆值类型数组会产生两个独立数组。
- 克隆引用类型数组会产生指向相同对象的两个数组。
Clone方法返回object类型的引用,它必须被强制转换成数组类型
例如,如下代码给出了一个克隆值类型数组的示例,它产生了两个独立的数组。图13-16演
示了代码中的一些步骤。
static void Main()
{int[] intArr1={1,2,3};int[] intArr2=(int[])intArr1.Clone();intArr2[0]=100;intArr2[1]=200;intArr2[2]=300;
}
克隆引用类型数组会产生指向相同对象的两个数组,如下代码给出了一个示例。图13-17演
示了代码中的一些步骤。
class A
{public int Value=5;
}class Program
{static void Main(){A[] AArray1=new A[3]{new A(),new A(),new A()};A[] AArray1=(A[]) AArray1.Clone();AArray2[0].Value=100;AArray2[1].Value=200;AArray2[2].Value=300;}
}