System.Array.Copy 方法 (Array, Int32, Array, Int32, Int32)

方法描述

从指定的源索引开始,复制 Array 中的一系列元素,将它们粘贴到另一 Array 中(从指定的目标索引开始)。 长度和索引指定为 32 位整数。

语法定义(C# System.Array.Copy 方法 (Array, Int32, Array, Int32, Int32) 的用法)

public static void Copy(
	Array sourceArray,
	int sourceIndex,
	Array destinationArray,
	int destinationIndex,
	int length
)

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
sourceArray System-Array Array ,它包含要复制的数据。
sourceIndex System-Int32 一个 32 位整数,它表示 sourceArray 中复制开始处的索引。
destinationArray System-Array Array ,它接收数据。
destinationIndex System-Int32 一个 32 位整数,它表示 destinationArray 中存储开始处的索引。
length System-Int32 一个 32 位整数,它表示要复制的元素数目。
返回值 void

提示和注释

sourceArray 和 destinationArray 参数必须具有相同的维数。

在多维数组之间复制时,数组像一维长数组那样操作,其中各行(或列)在概念上首尾相连。 例如,如果一个数组有三行(或列),每一行(或列)带有四个元素,若要从数组的开始复制六个元素,则会复制第一行(或列)的所有四个元素和第二行(或列)的头两个元素。 若要从第三行(或列)的第二个元素开始复制,则 sourceIndex 必须是第一行(或列)的上限加上第二行(或列)的长度再加上 2 之和。

如果 sourceArray 和 destinationArray 重叠,那么在覆盖 destinationArray 之前,此方法的行为好像 sourceArray 的原始值保留在临时位置那样。

[C++]

此方法等效于标准 C/C++ 函数 memmove,而不是 memcpy。

数组可以是引用类型的数组或值类型的数组。 按需要执行类型向下转换。

在从引用类型的数组复制到值类型的数组时,每一个元素都要取消装箱,然后再复制。 在从值类型的数组复制到引用类型的数组时,每一个元素都要装箱,然后再复制。

在从引用类型或值类型的数组复制到 Object 数组时,会创建 Object 以保存每一个值或引用,然后再复制。 在从 Object 数组复制到引用类型或值类型的数组,且不可能进行分配时,将引发 InvalidCastException。

如果 sourceArray 和 destinationArray 都是引用类型的数组或都是 Object 类型的数组,则执行浅表复制。 Array 的浅表副本是包含对与原始 Array 相同的元素的引用的新 Array。 不复制元素本身和元素引用的任何内容。 相比之下,Array 的深层副本会复制元素和元素直接或间接引用的一切。

如果数组是不兼容的类型,则会引发 ArrayTypeMismatchException。 类型兼容性的定义如下:

类型与其本身兼容。

值类型与 Object 兼容,也与该值类型实现的接口类型兼容。 只有当值类型直接实现一个接口时,该值类型才算与该接口连接。 断开连接的类型不兼容。

如果从源类型复制到目标类型是扩大转换,则两个内部(预定义)值类型兼容。 扩大转换从不会丢失信息,而收缩转换可能会丢失信息。 例如,将 32 位有符号的整数转换为 64 位有符号的整数是扩大转换,而将 64 位有符号的整数转换为 32 位有符号的整数是收缩转换。 有关转换的更多信息,请参见 Convert。

非内部(用户定义)值类型只与其本身兼容。

枚举具有到 Enum 的隐式转换,也有到其基础类型的隐式转换。

如果 sourceArray 中的每个元素都要求向下转换(例如,从基类转换到派生类或从接口转换到对象),且一个或多个元素无法强制转换为 destinationArray 中的对应类型,则会引发 InvalidCastException。

如果此方法在复制时引发异常,则 destinationArray 的状态未定义。

此方法的运算复杂度为 O(n),其中 n 是 length。

System.Array.Copy 方法 (Array, Int32, Array, Int32, Int32)例子

下面的代码示例说明如何从一个 Object 类型的 Array 复制到 integer 类型的另一个 Array。

using System;
public class SamplesArray  {

   public static void Main()  {

      // Creates and initializes a new Array of type Int32.
      Array myIntArray=Array.CreateInstance( typeof(System.Int32), 5 );
      for ( int i = myIntArray.GetLowerBound(0); i <= myIntArray.GetUpperBound(0); i++ )
         myIntArray.SetValue( i+1, i );

      // Creates and initializes a new Array of type Object.
      Array myObjArray = Array.CreateInstance( typeof(System.Object), 5 );
      for ( int i = myObjArray.GetLowerBound(0); i <= myObjArray.GetUpperBound(0); i++ )
         myObjArray.SetValue( i+26, i );

      // Displays the initial values of both arrays.
      Console.WriteLine( "Int32 array:" );
      PrintValues( myIntArray );
      Console.WriteLine( "Object array:" );
      PrintValues( myObjArray );

      // Copies the first element from the Int32 array to the Object array.
      Array.Copy( myIntArray, myIntArray.GetLowerBound(0), myObjArray, myObjArray.GetLowerBound(0), 1 );

      // Copies the last two elements from the Object array to the Int32 array.
      Array.Copy( myObjArray, myObjArray.GetUpperBound(0) - 1, myIntArray, myIntArray.GetUpperBound(0) - 1, 2 );

      // Displays the values of the modified arrays.
      Console.WriteLine( "Int32 array - Last two elements should now be the same as Object array:" );
      PrintValues( myIntArray );
      Console.WriteLine( "Object array - First element should now be the same as Int32 array:" );
      PrintValues( myObjArray );
   }


   public static void PrintValues( Array myArr )  {
      System.Collections.IEnumerator myEnumerator = myArr.GetEnumerator();
      int i = 0;
      int cols = myArr.GetLength( myArr.Rank - 1 );
      while ( myEnumerator.MoveNext() )  {
         if ( i < cols )  {
            i++;
         } else  {
            Console.WriteLine();
            i = 1;
         }
         Console.Write( "\t{0}", myEnumerator.Current );
      }
      Console.WriteLine();
   }
}
/*
This code produces the following output.

Int32 array:
    1    2    3    4    5
Object array:
    26    27    28    29    30
Int32 array - Last two elements should now be the same as Object array:
    1    2    3    29    30
Object array - First element should now be the same as Int32 array:
    1    27    28    29    30
*/

异常

异常 异常描述
ArgumentNullException
  • sourceArray 为 null。
  • destinationArray 为 null。
RankException sourceArray 和 destinationArray 的秩不同。
ArrayTypeMismatchException sourceArray 和 destinationArray 是不兼容的类型。
InvalidCastException sourceArray 中的至少一个元素无法强制转换为 destinationArray 类型。
ArgumentOutOfRangeException
  • sourceIndex 小于 sourceArray 的第一维的下限。
  • destinationIndex 小于 destinationArray 的第一维的下限。
  • length 小于零。
ArgumentException
  • length 大于从 sourceIndex 到 sourceArray 末尾的元素数。
  • length 大于从 destinationIndex 到 destinationArray 末尾的元素数。

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。