Поделиться через


Array.Copy Метод

Определение

Копирует диапазон элементов из одного массива Array в другой массив Array и при необходимости выполняет приведение типов и упаковку-преобразование.

Перегрузки

Copy(Array, Int64, Array, Int64, Int64)

Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Длина и индексы задаются как 64-разрядные целые числа.

Copy(Array, Int32, Array, Int32, Int32)

Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Длина и индексы задаются как 32-битовые целые числа.

Copy(Array, Array, Int32)

Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 32-битовое целое число.

Copy(Array, Array, Int64)

Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 64-битовое целое число.

Примеры

В следующем примере кода показано, как копировать данные из типа ArrayObject integer в другой Array .

using namespace System;
void PrintValues( Array^ myArr );
void main()
{
   
   // Creates and initializes a new Array instance of type Int32.
   Array^ myIntArray = Array::CreateInstance( Type::GetType(  "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 instance of type Object.
   Array^ myObjArray = Array::CreateInstance( Type::GetType(  "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 );
}

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
 */
open System

let printValues (myArr: 'a []) =
    let mutable i = 0;
    let cols = myArr.GetLength(myArr.Rank - 1)
    for item in myArr do
        if i < cols then
            i <- i + 1
        else
            printfn ""
            i <- 1
        printf $"\t{item}"
    printfn ""

 // Creates and initializes a new Array of type int.
let myIntArray = [| 1..5 |]

// Creates and initializes a new Array of type Object.
let myObjArray = Array.init 5 (fun i -> i + 26 :> obj)

// Displays the initial values of both arrays.
printfn "int array:"
printValues myIntArray 
printfn "Object array:"
printValues myObjArray

// Copies the first element from the int 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 int array.
Array.Copy(myObjArray, myObjArray.GetUpperBound 0 - 1, myIntArray, myIntArray.GetUpperBound 0 - 1, 2)

// Displays the values of the modified arrays.
printfn "int array - Last two elements should now be the same as Object array:"
printValues myIntArray 
printfn "Object array - First element should now be the same as int array:"
printValues myObjArray


// This code produces the following output.
//     int array:
//         1    2    3    4    5
//     Object array:
//         26    27    28    29    30
//     int 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 int array:
//         1    27    28    29    30
using System;
public class SamplesArray  {

   public static void Main()  {

      // Creates and initializes a new Array of type int.
      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( "int array:" );
      PrintValues( myIntArray );
      Console.WriteLine( "Object array:" );
      PrintValues( myObjArray );

      // Copies the first element from the int 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 int array.
      Array.Copy( myObjArray, myObjArray.GetUpperBound(0) - 1, myIntArray, myIntArray.GetUpperBound(0) - 1, 2 );

      // Displays the values of the modified arrays.
      Console.WriteLine( "int 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 int 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.

int array:
    1    2    3    4    5
Object array:
    26    27    28    29    30
int 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 int array:
    1    27    28    29    30
*/
Public Class SamplesArray    
    
    Public Shared Sub Main()
        
        ' Creates and initializes a new Array of type Int32.
        Dim myIntArray As Array = _
           Array.CreateInstance(GetType(System.Int32), 5)
        Dim i As Integer
        For i = myIntArray.GetLowerBound(0) To myIntArray.GetUpperBound(0)
            myIntArray.SetValue(i + 1, i)
        Next i 
        ' Creates and initializes a new Array of type Object.
        Dim myObjArray As Array = _
           Array.CreateInstance(GetType(System.Object), 5)
        For i = myObjArray.GetLowerBound(0) To myObjArray.GetUpperBound(0)
            myObjArray.SetValue(i + 26, i)
        Next 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)
    End Sub
    
    Public Shared Sub PrintValues(myArr As Array)
        Dim myEnumerator As System.Collections.IEnumerator = _
           myArr.GetEnumerator()
        Dim i As Integer = 0
        Dim cols As Integer = myArr.GetLength((myArr.Rank - 1))
        While myEnumerator.MoveNext()
            If i < cols Then
                i += 1
            Else
                Console.WriteLine()
                i = 1
            End If
            Console.Write(ControlChars.Tab + "{0}", myEnumerator.Current)
        End While
        Console.WriteLine()
    End Sub
End Class

' 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

Copy(Array, Int64, Array, Int64, Int64)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Длина и индексы задаются как 64-разрядные целые числа.

public:
 static void Copy(Array ^ sourceArray, long sourceIndex, Array ^ destinationArray, long destinationIndex, long length);
public static void Copy (Array sourceArray, long sourceIndex, Array destinationArray, long destinationIndex, long length);
static member Copy : Array * int64 * Array * int64 * int64 -> unit
Public Shared Sub Copy (sourceArray As Array, sourceIndex As Long, destinationArray As Array, destinationIndex As Long, length As Long)

Параметры

sourceArray
Array

Массив Array, содержащий данные, которые требуется скопировать.

sourceIndex
Int64

64-разрядное целое число, представляющее индекс в массиве sourceArray, с которого начинается копирование.

destinationArray
Array

Массив Array, принимающий данные.

destinationIndex
Int64

64-разрядное целое число, представляющее индекс в массиве destinationArray, с которого начинается сохранение.

length
Int64

64-битовое целое число, представляющее число копируемых элементов. Целое число должно находиться в диапазоне от нуля до Int32.MaxValue включительно.

Исключения

sourceArray имеет значение null.

-или-

destinationArray имеет значение null.

sourceArray и destinationArray имеют различные ранги.

sourceArray и destinationArray имеют несовместимые типы.

По меньшей мере один элемент в sourceArray не может быть приведен к типу destinationArray.

sourceIndex находится вне диапазона допустимых индексов для sourceArray.

-или-

destinationIndex находится вне диапазона допустимых индексов для destinationArray.

-или-

length значение меньше 0 или больше int32.MaxValue.

length больше числа элементов с sourceIndex до конца sourceArray.

-или-

length больше числа элементов с destinationIndex до конца destinationArray.

Комментарии

Параметры sourceArray и destinationArray должны иметь одинаковое количество измерений. Кроме того, destinationArray уже должны быть измерены и иметь достаточное количество элементов, начиная с destinationIndex позиции, для размещения скопированных данных.

При копировании между многомерными массивами массив ведет себя как длинный одномерный массив, где строки (или столбцы) концептуально проложены сквозно. Например, если массив содержит три строки (или столбцы) с четырьмя элементами в каждом, копирование шести элементов из начала массива приведет к копированию всех четырех элементов первой строки (или столбца) и первых двух элементов второй строки (или столбца). Чтобы начать копирование со второго элемента третьей строки (или столбца), sourceIndex должна быть верхняя граница первой строки (или столбца) плюс длина второй строки (или столбца) плюс два.

Если sourceArray и destinationArray перекрываются, этот метод ведет себя так, как если бы исходные значения sourceArray были сохранены во временном расположении до destinationArray перезаписи.

[C++]

Этот метод эквивалентен стандартной функции memmoveC/C++, а не 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

См. также раздел

Применяется к

Copy(Array, Int32, Array, Int32, Int32)

Исходный код:
Array.CoreCLR.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Длина и индексы задаются как 32-битовые целые числа.

public:
 static void Copy(Array ^ sourceArray, int sourceIndex, Array ^ destinationArray, int destinationIndex, int length);
public static void Copy (Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length);
static member Copy : Array * int * Array * int * int -> unit
Public Shared Sub Copy (sourceArray As Array, sourceIndex As Integer, destinationArray As Array, destinationIndex As Integer, length As Integer)

Параметры

sourceArray
Array

Массив Array, содержащий данные, которые требуется скопировать.

sourceIndex
Int32

32-разрядное целое число, представляющее индекс в массиве sourceArray, с которого начинается копирование.

destinationArray
Array

Массив Array, принимающий данные.

destinationIndex
Int32

32-разрядное целое число, представляющее индекс в массиве destinationArray, с которого начинается сохранение.

length
Int32

32-битовое целое число, представляющее число копируемых элементов.

Исключения

sourceArray имеет значение null.

-или-

destinationArray имеет значение null.

sourceArray и destinationArray имеют различные ранги.

sourceArray и destinationArray имеют несовместимые типы.

По меньшей мере один элемент в sourceArray не может быть приведен к типу destinationArray.

sourceIndex меньше, чем нижняя граница первого измерения массива sourceArray.

-или-

destinationIndex меньше, чем нижняя граница первого измерения массива destinationArray.

-или-

Значение параметра length меньше нуля.

length больше числа элементов с sourceIndex до конца sourceArray.

-или-

length больше числа элементов с destinationIndex до конца destinationArray.

Комментарии

Параметры sourceArray и destinationArray должны иметь одинаковое количество измерений. Кроме того, destinationArray уже должны быть измерены и иметь достаточное количество элементов, начиная с destinationIndex позиции, для размещения скопированных данных.

При копировании между многомерными массивами массив ведет себя как длинный одномерный массив, где строки (или столбцы) концептуально проложены сквозно. Например, если массив содержит три строки (или столбцы) с четырьмя элементами в каждом, копирование шести элементов из начала массива приведет к копированию всех четырех элементов первой строки (или столбца) и первых двух элементов второй строки (или столбца). Чтобы начать копирование со второго элемента третьей строки (или столбца), sourceIndex должна быть верхняя граница первой строки (или столбца) плюс длина второй строки (или столбца) плюс два.

Если sourceArray и destinationArray перекрываются, этот метод ведет себя так, как если бы исходные значения sourceArray были сохранены во временном расположении до destinationArray перезаписи.

[C++]

Этот метод эквивалентен стандартной функции memmoveC/C++, а не 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

См. также раздел

Применяется к

Copy(Array, Array, Int32)

Исходный код:
Array.CoreCLR.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 32-битовое целое число.

public:
 static void Copy(Array ^ sourceArray, Array ^ destinationArray, int length);
public static void Copy (Array sourceArray, Array destinationArray, int length);
static member Copy : Array * Array * int -> unit
Public Shared Sub Copy (sourceArray As Array, destinationArray As Array, length As Integer)

Параметры

sourceArray
Array

Массив Array, содержащий данные, которые требуется скопировать.

destinationArray
Array

Массив Array, принимающий данные.

length
Int32

32-битовое целое число, представляющее число копируемых элементов.

Исключения

sourceArray имеет значение null.

-или-

destinationArray имеет значение null.

sourceArray и destinationArray имеют различные ранги.

sourceArray и destinationArray имеют несовместимые типы.

По меньшей мере один элемент в sourceArray не может быть приведен к типу destinationArray.

Значение параметра length меньше нуля.

length больше числа элементов в sourceArray.

-или-

length больше числа элементов в destinationArray.

Комментарии

Параметры sourceArray и destinationArray должны иметь одинаковое количество измерений. Кроме того, destinationArray уже должны быть измерены и иметь достаточное количество элементов для размещения скопированных данных.

При копировании между многомерными массивами массив ведет себя как длинный одномерный массив, где строки (или столбцы) концептуально проложены до конца. Например, если массив содержит три строки (или столбцы) с четырьмя элементами в каждом, копирование шести элементов из начала массива приведет к копированию всех четырех элементов первой строки (или столбца) и первых двух элементов второй строки (или столбца).

Если sourceArray и destinationArray перекрываются, этот метод ведет себя так, как если бы исходные значения sourceArray были сохранены во временном расположении до destinationArray перезаписи.

[C++]

Этот метод эквивалентен стандартной функции memmoveC/C++, а не 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

См. также раздел

Применяется к

Copy(Array, Array, Int64)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 64-битовое целое число.

public:
 static void Copy(Array ^ sourceArray, Array ^ destinationArray, long length);
public static void Copy (Array sourceArray, Array destinationArray, long length);
static member Copy : Array * Array * int64 -> unit
Public Shared Sub Copy (sourceArray As Array, destinationArray As Array, length As Long)

Параметры

sourceArray
Array

Массив Array, содержащий данные, которые требуется скопировать.

destinationArray
Array

Массив Array, принимающий данные.

length
Int64

64-битовое целое число, представляющее число копируемых элементов. Целое число должно находиться в диапазоне от нуля до Int32.MaxValue включительно.

Исключения

sourceArray имеет значение null.

-или-

destinationArray имеет значение null.

sourceArray и destinationArray имеют различные ранги.

sourceArray и destinationArray имеют несовместимые типы.

По меньшей мере один элемент в sourceArray не может быть приведен к типу destinationArray.

length значение меньше 0 или больше int32.MaxValue.

length больше числа элементов в sourceArray.

-или-

length больше числа элементов в destinationArray.

Комментарии

Параметры sourceArray и destinationArray должны иметь одинаковое количество измерений. Кроме того, destinationArray уже должны быть измерены и иметь достаточное количество элементов для размещения скопированных данных.

При копировании между многомерными массивами массив ведет себя как длинный одномерный массив, где строки (или столбцы) концептуально проложены до конца. Например, если массив содержит три строки (или столбцы) с четырьмя элементами в каждом, копирование шести элементов из начала массива приведет к копированию всех четырех элементов первой строки (или столбца) и первых двух элементов второй строки (или столбца).

Если sourceArray и destinationArray перекрываются, этот метод ведет себя так, как если бы исходные значения sourceArray были сохранены во временном расположении до destinationArray перезаписи.

[C++]

Этот метод эквивалентен стандартной функции memmoveC/C++, а не 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

См. также раздел

Применяется к