簡體   English   中英

C#通過引用傳遞數組

[英]C# Passing array by reference

我知道有非常相似的問題,但是我需要知道在這種情況下發生了什么。 我編寫了一個函數來沿特定維度反轉多維數組的項。 為此,我將多維數組轉換為鋸齒狀數組,然后遞歸地找到執行反轉的數組維度。

public static void Reverse(this Array array, int dimension, int start, int end)
{
    object[] jag = array.ToJaggedArray();

    if (!jag.ReverseAux(0, dimension, start, end))
        throw new ArgumentOutOfRangeException("dimension", dimension, "Dimension must be nonnegative and less than array dimensions number.");

    array = jag;
}

現在我的問題是,當我運行此方法時,我的輸入數組尚未被修改。 不應通過引用傳遞數組嗎? 當我分配array = jag為什么要在方法內部正確分配而不在外部正確分配?

例如:

// create 2D array of strings
string[,] ar = {{"00", "01", "02"},
                {"10", "11", "12"},
                {"20", "21", "22"}};
// reverse the first dimension (rows)
ar.Reverse(0, 0, 2);
// show the result
MessageBox.Show(ar.ToString(null, null));

輸出為{{00, 01, 02}, {10, 11, 12}, {20, 21, 22}} ,即原始數組。 如果我以Reverse方法檢查輸出

public static void Reverse(this Array array, int dimension, int start, int end)
{
    //...

    array = jag;
    System.Windows.Forms.MessageBox.Show(array.ToString(null, null));
}

這顯示了正確的反向數組{{20, 21, 22}, {10, 11, 12}, {00, 01, 02}}

不應通過引用傳遞數組嗎? 為什么在本地賦值后,我的輸入數組引用原始指針而不是賦值指針? 我應該使用ref關鍵字作為數組參數嗎? 如果是,是否可以繼續使用此方法作為Array類型的擴展?

除了outref修飾符外,函數參數中的所有引用/值都可以視為局部變量(盡管,您仍然可以在引用對象內部更改值)。

在C#中,我們執行這樣的擴展方法,因此它看起來像是無狀態擴展方法:

public static Array Reverse(this Array array, int dimension, int start, int end)
{
    object[] jag = array.ToJaggedArray();

    if (!jag.ReverseAux(0, dimension, start, end))
        throw new ArgumentOutOfRangeException("dimension", dimension, "Dimension must be nonnegative and less than array dimensions number.");

    return jag;
}

var output = input.Reverse(...);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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