Array.Copy 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
多載
| 名稱 | Description |
|---|---|
| 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位整數。 |
範例
以下程式碼範例說明如何從一個 Array 型別 Object 的整數型複製到另一個 Array 型別。
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.cs
- 來源:
- Array.cs
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)
參數
- sourceIndex
- Int64
一個 64 位元整數,代表複製開始的索引 sourceArray 。
- destinationIndex
- Int64
一個 64 位元整數,代表儲存開始的索引 destinationArray 。
- length
- Int64
一個 64 位元整數,代表要複製的元素數量。 整數必須介於零與 Int32.MaxValue 之間,包含。
例外狀況
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++]
此方法等價於標準的 C/C++ 函式 memmove,而非 memcpy。
陣列可以是參考型陣列或值型陣列。 視需要執行型別下放。
當從參考型陣列複製到值型陣列時,每個元素先開箱再複製。 當從值型陣列複製到參考型陣列時,每個元素先被框定後再複製。
當從參考型別或值型態陣列複製到陣 Object 列時, Object 會建立一個來保存每個值或參考,然後再複製。 當從 Object 陣列複製到參考型別或值型型陣列且無法執行指派時,會拋出 a InvalidCastException 。
若
sourceArray和destinationArray都是參考型態陣列,或 都是型別 Object的陣列,則會執行淺層複製。 淺Array層副本 是包含與原始Array相同元素的 新副本Array。 元素本身或元素所參考的任何東西都不會被複製。 相較之下,深層複製品 Array 會複製元素以及元素直接或間接引用的所有事物。
若陣列類型不相容,則會拋出 A ArrayTypeMismatchException 。 型別相容性的定義如下:
一個型別與自身相容。
一個值型別與 Object 該值型別所實作的介面型別相容。 只有當一個值類型直接實作該介面時,才被視為連接該介面。 斷開的類型不相容。
若從來源類型複製到目的類型是擴大轉換,兩種內在(預先定義)值類型是相容的。 擴大轉換永遠不會遺失資訊,而縮小轉換則可能遺失資訊。 例如,將一個32位元有號整數轉換成64位元有號整數是寬度轉換,而將64位元有號整數轉換為32位元有號整數則是窄位轉換。 欲了解更多關於轉換的資訊,請參見 Convert。
非內在(使用者定義)值類型僅與自身相容。
列舉有隱含的轉換與 Enum 其底層型別的轉換。
如果 中的sourceArray每個元素都需要下拋(例如從基底類別到導出類別,或從介面到物件),且無法將一個或多個元素鑄造成對應的型別 。destinationArrayInvalidCastException
如果此方法在複製時拋出例外,則 的 destinationArray 狀態未定義。
此方法是一個 O(n) 運算,其中 n 為 length。
另請參閱
適用於
Copy(Array, Int32, Array, Int32, Int32)
- 來源:
- Array.cs
- 來源:
- Array.cs
- 來源:
- Array.cs
- 來源:
- Array.cs
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)
參數
- sourceIndex
- Int32
一個 32 位元整數,代表複製開始的索引 sourceArray 。
- destinationIndex
- Int32
一個 32 位元整數,代表儲存開始的索引 destinationArray 。
- length
- Int32
一個 32 位元整數,代表要複製的元素數量。
例外狀況
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++]
此方法等價於標準的 C/C++ 函式 memmove,而非 memcpy。
陣列可以是參考型陣列或值型陣列。 視需要執行型別下放。
當從參考型陣列複製到值型陣列時,每個元素先開箱再複製。 當從值型陣列複製到參考型陣列時,每個元素先被框定後再複製。
當從參考型別或值型態陣列複製到陣 Object 列時, Object 會建立一個來保存每個值或參考,然後再複製。 當從 Object 陣列複製到參考型別或值型型陣列且無法執行指派時,會拋出 a InvalidCastException 。
若
sourceArray和destinationArray都是參考型態陣列,或 都是型別 Object的陣列,則會執行淺層複製。 淺Array層副本 是包含與原始Array相同元素的 新副本Array。 元素本身或元素所參考的任何東西都不會被複製。 相較之下,深層複製品 Array 會複製元素以及元素直接或間接引用的所有事物。
若陣列類型不相容,則會拋出 A ArrayTypeMismatchException 。 型別相容性的定義如下:
一個型別與自身相容。
一個值型別與 Object 該值型別所實作的介面型別相容。 只有當一個值類型直接實作該介面時,才被視為連接該介面。 斷開的類型不相容。
若從來源類型複製到目的類型是擴大轉換,兩種內在(預先定義)值類型是相容的。 擴大轉換永遠不會遺失資訊,而縮小轉換則可能遺失資訊。 例如,將一個32位元有號整數轉換成64位元有號整數是寬度轉換,而將64位元有號整數轉換為32位元有號整數則是窄位轉換。 欲了解更多關於轉換的資訊,請參見 Convert。
非內在(使用者定義)值類型僅與自身相容。
列舉有隱含的轉換與 Enum 其底層型別的轉換。
如果 中的sourceArray每個元素都需要下拋(例如從基底類別到導出類別,或從介面到物件),且無法將一個或多個元素鑄造成對應的型別 。destinationArrayInvalidCastException
如果此方法在複製時拋出例外,則 的 destinationArray 狀態未定義。
此方法是一個 O(n) 運算,其中 n 為 length。
另請參閱
適用於
Copy(Array, Array, Int32)
- 來源:
- Array.cs
- 來源:
- Array.cs
- 來源:
- Array.cs
- 來源:
- Array.cs
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)
參數
- length
- Int32
一個 32 位元整數,代表要複製的元素數量。
例外狀況
sourceArray 而且 destinationArray 有不同的軍階。
sourceArray 以及 destinationArray 不相容的類型。
至少有一個元素 sourceArray 無法被鑄造為 的類型 destinationArray。
length 小於零。
備註
sourceArray和destinationArray參數的維度數必須相同。 此外, destinationArray 必須已經有尺寸設定,且元素數量必須足夠容納複製的資料。
在多維陣列間複製時,陣列表現得像一個長的一維陣列,列(或欄位)在概念上是端對端排列的。 例如,若陣列有三列(或列),每列有四個元素,從陣列起始複製六個元素,將複製第一列(或列)的全部四個元素,以及第二列(或列)的前兩個元素。
若 sourceArray 與 destinationArray 重疊,此方法表現為先前 的 sourceArray 原始值被暫時保留 destinationArray 於被覆寫。
[C++]
此方法等價於標準的 C/C++ 函式 memmove,而非 memcpy。
陣列可以是參考型陣列或值型陣列。 視需要執行型別下放。
當從參考型陣列複製到值型陣列時,每個元素先開箱再複製。 當從值型陣列複製到參考型陣列時,每個元素先被框定後再複製。
當從參考型別或值型態陣列複製到陣 Object 列時, Object 會建立一個來保存每個值或參考,然後再複製。 當從 Object 陣列複製到參考型別或值型型陣列且無法執行指派時,會拋出 a InvalidCastException 。
若
sourceArray和destinationArray都是參考型態陣列,或 都是型別 Object的陣列,則會執行淺層複製。 淺Array層副本 是包含與原始Array相同元素的 新副本Array。 元素本身或元素所參考的任何東西都不會被複製。 相較之下,深層複製品 Array 會複製元素以及元素直接或間接引用的所有事物。
若陣列類型不相容,則會拋出 A ArrayTypeMismatchException 。 型別相容性的定義如下:
一個型別與自身相容。
一個值型別與 Object 該值型別所實作的介面型別相容。 只有當一個值類型直接實作該介面時,才被視為連接該介面。 斷開的類型不相容。
若從來源類型複製到目的類型是擴大轉換,兩種內在(預先定義)值類型是相容的。 擴大轉換永遠不會遺失資訊,而縮小轉換則可能遺失資訊。 例如,將一個32位元有號整數轉換成64位元有號整數是寬度轉換,而將64位元有號整數轉換為32位元有號整數則是窄位轉換。 欲了解更多關於轉換的資訊,請參見 Convert。
非內在(使用者定義)值類型僅與自身相容。
列舉有隱含的轉換與 Enum 其底層型別的轉換。
如果 中的sourceArray每個元素都需要下拋(例如從基底類別到導出類別,或從介面到物件),且無法將一個或多個元素鑄造成對應的型別 。destinationArrayInvalidCastException
如果此方法在複製時拋出例外,則 的 destinationArray 狀態未定義。
此方法是一個 O(n) 運算,其中 n 為 length。
另請參閱
適用於
Copy(Array, Array, Int64)
- 來源:
- Array.cs
- 來源:
- Array.cs
- 來源:
- Array.cs
- 來源:
- Array.cs
- 來源:
- Array.cs
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)
參數
- length
- Int64
一個 64 位元整數,代表要複製的元素數量。 整數必須介於零與 Int32.MaxValue 之間,包含。
例外狀況
sourceArray 而且 destinationArray 有不同的軍階。
sourceArray 以及 destinationArray 不相容的類型。
至少有一個元素 sourceArray 無法被鑄造為 的類型 destinationArray。
length 小於 0 或大於 Int32.MaxValue。
備註
sourceArray和destinationArray參數的維度數必須相同。 此外, destinationArray 必須已經有尺寸設定,且元素數量必須足夠容納複製的資料。
在多維陣列間複製時,陣列表現得像一個長的一維陣列,列(或欄位)在概念上是端對端排列的。 例如,若陣列有三列(或列),每列有四個元素,從陣列起始複製六個元素,將複製第一列(或列)的全部四個元素,以及第二列(或列)的前兩個元素。
若 sourceArray 與 destinationArray 重疊,此方法表現為先前 的 sourceArray 原始值被暫時保留 destinationArray 於被覆寫。
[C++]
此方法等價於標準的 C/C++ 函式 memmove,而非 memcpy。
陣列可以是參考型陣列或值型陣列。 視需要執行型別下放。
當從參考型陣列複製到值型陣列時,每個元素先開箱再複製。 當從值型陣列複製到參考型陣列時,每個元素先被框定後再複製。
當從參考型別或值型態陣列複製到陣 Object 列時, Object 會建立一個來保存每個值或參考,然後再複製。 當從 Object 陣列複製到參考型別或值型型陣列且無法執行指派時,會拋出 a InvalidCastException 。
若
sourceArray和destinationArray都是參考型態陣列,或 都是型別 Object的陣列,則會執行淺層複製。 淺Array層副本 是包含與原始Array相同元素的 新副本Array。 元素本身或元素所參考的任何東西都不會被複製。 相較之下,深層複製品 Array 會複製元素以及元素直接或間接引用的所有事物。
若陣列類型不相容,則會拋出 A ArrayTypeMismatchException 。 型別相容性的定義如下:
一個型別與自身相容。
一個值型別與 Object 該值型別所實作的介面型別相容。 只有當一個值類型直接實作該介面時,才被視為連接該介面。 斷開的類型不相容。
若從來源類型複製到目的類型是擴大轉換,兩種內在(預先定義)值類型是相容的。 擴大轉換永遠不會遺失資訊,而縮小轉換則可能遺失資訊。 例如,將一個32位元有號整數轉換成64位元有號整數是寬度轉換,而將64位元有號整數轉換為32位元有號整數則是窄位轉換。 欲了解更多關於轉換的資訊,請參見 Convert。
非內在(使用者定義)值類型僅與自身相容。
列舉有隱含的轉換與 Enum 其底層型別的轉換。
如果 中的sourceArray每個元素都需要下拋(例如從基底類別到導出類別,或從介面到物件),且無法將一個或多個元素鑄造成對應的型別 。destinationArrayInvalidCastException
如果此方法在複製時拋出例外,則 的 destinationArray 狀態未定義。
此方法是一個 O(n) 運算,其中 n 為 length。