Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Array.Copy-Methode: (Array, Int64, Array, Int64, Int64)

 

Veröffentlicht: Oktober 2016

Kopiert einen beim angegebenen Quellindex beginnenden Elementbereich aus einem Array und fügt ihn ab dem angegebenen Zielindex in ein anderes Array ein. Die Länge und die Indizes werden als 64-Bit-Ganzzahlen angegeben.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

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

Parameter

sourceArray
Type: System.Array

Das Array, das die zu kopierenden Daten enthält.

sourceIndex
Type: System.Int64

Eine 64-Bit-Ganzzahl, die den Index im sourceArray angibt, ab dem kopiert werden soll.

destinationArray
Type: System.Array

Das Array, das die Daten empfängt.

destinationIndex
Type: System.Int64

Eine 64-Bit-Ganzzahl, die den Index im destinationArray angibt, ab dem gespeichert werden soll.

length
Type: System.Int64

Eine 64-Bit-Ganzzahl, die die Anzahl der zu kopierenden Elemente darstellt. Die Ganzzahl muss zwischen 0 (null) und einschließlich Int32.MaxValue liegen.

Exception Condition
ArgumentNullException

sourceArray ist null.

- oder -

destinationArray ist null.

RankException

sourceArray und destinationArray sind von unterschiedlichem Rang.

ArrayTypeMismatchException

sourceArray und destinationArray weisen inkompatible Typen auf.

InvalidCastException

Mindestens ein Element im sourceArray kann nicht in den Typ des destinationArrays umgewandelt werden.

ArgumentOutOfRangeException

sourceIndex liegt außerhalb des Bereichs der gültigen Indizes für das sourceArray.

- oder -

destinationIndex liegt außerhalb des Bereichs der gültigen Indizes für das destinationArray.

- oder -

length ist kleiner als 0 oder größer als Int32.MaxValue.

ArgumentException

length ist größer als die Anzahl der Elemente vom sourceIndex bis zum Ende des sourceArrays.

- oder -

length ist größer als die Anzahl der Elemente vom destinationIndex bis zum Ende des destinationArrays.

Die sourceArray und destinationArray Parameter müssen die gleiche Anzahl von Dimensionen aufweisen. Darüber hinaus destinationArray muss bereits haben wurde dimensioniert und muss eine ausreichende Anzahl von Elementen, beginnend mit der destinationIndex Position, um die kopierten Daten aufzunehmen.

Beim Kopieren zwischen mehrdimensionalen Arrays verhält sich das Array wie ein langes eindimensionales Array, in denen Zeilen (oder Spalten) konzeptionell End-to-End-angeordnet sind. Wenn ein Array drei Zeilen (oder Spalten) mit vier Elementen, Kopieren von sechs Elementen vom Anfang des Arrays würde beispielsweise alle vier Elemente der ersten Zeile (oder Spalte) und die ersten beiden Elemente der zweiten Zeile (oder Spalte) kopieren. Zu kopierende aus dem zweiten Element der dritten Zeile (oder Spalte) sourceIndex muss die obere Grenze der ersten Zeile (oder Spalte) plus 2 plus die Länge der zweiten Zeile (oder Spalte) sein.

Wenn sourceArray und destinationArray überschneiden, die diese Methode verhält sich wie die ursprünglichen Werte der sourceArray beibehalten wurden, in ein temporäres Verzeichnis vor destinationArray überschrieben wird.

[C++]

Diese Methode entspricht der C/C++-Standardfunktion memmove, nicht memcpy.

Die Arrays können Verweistyp-Arrays oder Werttyp Arrays sein. Es erfolgt eine Umwandlung des Typs, wie erforderlich.

  • Beim Kopieren von einem Referenztyp Array in ein Array von Werttyp wird jedes Element mittels Unboxing zurückkonvertiert und kopiert. Wenn von einem Werttyp Array in ein Array von Verweistypen zu kopieren, wird jedes Element geschachtelt und kopiert.

  • Beim Kopieren aus einem Array-Verweistyp oder Werttyp in einen Object Array, ein Object erstellt, um jeden Wert oder Verweis aufzunehmen und anschließend kopiert wird. Beim Kopieren aus einer Object Array in ein Array-Verweistyp oder Werttyp und die Zuweisung ist nicht möglich, eine InvalidCastException ausgelöst wird.

  • Wenn sourceArray und destinationArray Verweistyp-Arrays sind oder werden beide Arrays des Typs Object, eine flache Kopie ausgeführt wird. Eine flache Kopie von einer Array ist ein neues Arrayenthält Verweise auf die gleichen Elemente wie die ursprüngliche Array. Die Elemente selbst oder einem beliebigen Element verwiesen wird, durch die Elemente werden nicht kopiert. Im Gegensatz dazu eine tiefe Kopie von einer Array kopiert die Elemente und alles, was auf die Elemente direkt oder indirekt verweist.

Ein ArrayTypeMismatchException wird ausgelöst, wenn die Arrays von inkompatiblen Typen sind. Typkompatibilität ist wie folgt definiert:

  • Ein Typ ist mit sich selbst kompatibel.

  • Ein Werttyp ist kompatibel mit Object und mit einem Schnittstellentyp, der durch diesen Werttyp implementiert. Ein Werttyp gilt nur, wenn sie diese Schnittstelle, direkt implementiert mit einer Schnittstelle verbunden. Nicht verbundene Typen sind nicht kompatibel.

  • Zwei systeminterne (vordefinierte) Werttypen sind kompatibel, wenn das Kopieren aus einer Datenquelle in den Zieltyp eine erweiternde Konvertierung ist. Nie eine erweiternde Konvertierung verliert Informationen an, während eine einschränkende Konvertierung Informationen verloren gehen kann. Z. B. eine erweiternde Konvertierung ist eine 32-Bit-Ganzzahl mit Vorzeichen in eine 64-Bit-Ganzzahl mit Vorzeichen zu konvertieren, und konvertieren eine 64-Bit-Ganzzahl mit Vorzeichen in eine 32-Bit-Ganzzahl mit Vorzeichen ist eine einschränkende Konvertierung. Weitere Informationen zu Konvertierungen finden Sie unter Convert.

  • Ein systeminterner (Benutzerdefiniert) Werttyp ist nur mit sich selbst kompatibel.

  • Enumerationen verfügen über eine implizite Konvertierung in Enum und ihren zugrunde liegenden Typ.

Wenn jedes Element in sourceArray eine Umwandlung erfordert (z. B. von einer Basisklasse in einer abgeleiteten Klasse oder von einer Schnittstelle zu einem Objekt) und einem oder mehreren Elementen können nicht in den entsprechenden Typ umgewandelt werden destinationArray, wird eine InvalidCastException ausgelöst wird.

Wenn diese Methode eine Ausnahme während des Kopiervorgangs, des Status des destinationArray ist nicht definiert.

Diese Methode ist eine O (n) Vorgang, wobei n ist length.

Im folgenden Codebeispiel wird veranschaulicht, wie von einem kopiert Array des Typs Object in eine andere Array vom Typ Integer.

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

.NET Framework
Verfügbar seit 1.1
Zurück zum Anfang
Anzeigen: