簡體   English   中英

原始數組發生變化,但克隆數組保持不變; C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM