[英]Change in original array but the clone array stay the same; C#
這是我的原始數組,稱為“gridPlacement”
原始數組:“gridPlacement”
克隆陣列:“p1”
class gridMemory
{
static public string[] gridPlacement =
new string[9] {"x", "b", "c", "h", null, null, null, null, null };
}
這是我的克隆數組,名為“p1”。 雖然,它只包含原始數組的一部分。
class handleWinLost
{
static public string[] p1 = new string[3] {
gridMemory.gridPlacement[0],
gridMemory.gridPlacement[3]
gridMemory.gridPlacement[2]
};
}
當我將原始數組的索引 2 從“c”更改為“b”時。 數組p1
最后一個元素保持不變,“c”。 盡管gridMemory.gridPlacement[2]
是p1[2]
。
這個說法:
static public string[] p1 = new string[3] {
gridMemory.gridPlacement[0],
gridMemory.gridPlacement[3]
gridMemory.gridPlacement[2]
};
... 創建一個數組,並為元素賦值。 撇開它是一個字段聲明的事實不談,它等同於:
string[] p1 = new string[3];
p1[0] = gridMemory.gridPlacement[0];
p1[1] = gridMemory.gridPlacement[3];
p1[2] = gridMemory.gridPlacement[2];
這些賦值中的每一個都只是計算右側的表達式,並將其復制到左側描述的數組元素中。 它不會在 say p1[0]
和gridMemory.gridPlacement[0]
之間建立任何持久關系。 handleWinLost.p1
中的任何后續更改都與gridMemory.gridPlacement
完全無關。
您打算運行這行代碼:
gridMemory.gridPlacement[2] = "b";
歸根結底,字符串是經過一些特殊處理以賦予它們值語義的引用類型。 這意味着最初您有兩個引用變量gridMemory.gridPlacement[2]
和p1[2]
——它們都引用 memory 中的同一個字符串 object,它的值恰好為"c"
。
也就是說,我們有變量gridMemory.gridPlacement[2]
,其值是對 memory 中某個地址的引用,我們有變量p1[2]
,其值是對 memory 中同一地址的不同引用。這是因為gridMemory.gridPlacement[2]
中的引用已分配給p1[2]
。 但是,此分配復制了引用,因此您現在有兩個引用。 它們碰巧指向相同的 memory,但它們不是相同的引用。
所以現在我們運行這行代碼。 它所做的是在 memory ( "b"
) 中創建一個新字符串 object ,並將對該字符串 object 的引用分配給gridMemory.gridPlacement[2]
。
p1[2]
從來沒有參與這行代碼。 p1[2]
有自己的引用。 此引用仍引用相同的 memory,其值仍為"c"
。
如果要反映原始數組的更改,請改為存儲索引:
public static int[] p1 = new int[3] { 0, 3, 2 };
然后得到這樣的值:
string value = gridMemory.gridPlacement[p1[i]];
您還可以將p1
私有並提供訪問方法:
private static int[] p1 = new int[3] { 0, 3, 2 };
public static int PlacementCount => p1.Length;
public static string GetPlacementAt(int index)
{
return gridMemory.gridPlacement[p1[index]];
}
並像這樣訪問它(以循環為例):
for (int i = 0; i < handleWinLost.PlacementCount; i++) {
string placement = handleWinLost.GetPlacementAt(i);
Console.WriteLine(placement);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.