簡體   English   中英

為什么遵循靜態函數不起作用?

[英]Why following static function doesn't work ?

這是我的代碼:

public static class s {

    public static int Dx(this int i, Action<int> act, Func<int, bool> con) {
        if (con(i)) act(i);
        return i;
    }
}

稍后在我的代碼中,我這樣做:

int g = 22;
int false_con = g.Dx(j => j = 11, z => z != 22); // This is 22 which is fine.
int true_con = g.Dx(j => j = 11, z => z == 22);  //This is also 22 which should be 11

如何解決呢?

到目前為止,給出的答案都不是實際的解釋。

到目前為止,給出的許多答案都表明發生這種情況是因為int是一種值類型。 嘗試在此程序中將所有int替換為object 它會按照原始海報的預期開始工作嗎? 否。那么它與值類型與引用類型無關。

相反,它與變量的值有關,而與變量的類型無關。

Mahdi,您的期望是形式參數j成為形式參數i別名 ,而形式參數i又是局部變量g的別名,因此對j任何更改也將導致對g的更改,因為它們是相同的變量。 事實並非如此。 jig相同值的副本,但具有不同的存儲位置 ,因此,使一個變量不變就不會使另一個變量突變。

在C#中,您說“此形式參數是此變量的別名”的方式是使用refout關鍵字。 因此,該程序可以實現您的期望:

delegate void RefAction<T>(ref T t);
...
public static int Dx(ref int i, RefAction<int> act, Func<int, bool> con) 
{
    if (con(i)) 
        act(ref i);
    return i;
}
...
int g = 22;
int false_con = Dx(ref g, (ref int j) => { j = 11; }, z => z != 22); 
int true_con = Dx(ref g, (ref int j) => { j = 11; }, z => z == 22); 

“ ref”關鍵字表示gij都是同一變量的不同名稱。

正如D Stanley所指出的那樣,這可能是不好的風格。 與其更改方法中的變量,不如返回您想要將其更改為的值,並讓調用者確定要更改的變量(如果有)。

調用Action不會導致代碼路徑更改,因此程序始終返回i

它看起來像你期望g第一個電話,因為G的復制到這是不正確后改為11 j ,然后到i ,而不是參考 g ,意在值g沒有被修改為您的行動的結果。

一種選擇是返回值,而不是嘗試修改它:

public static int Dx(this int i, Func<int, int> act, Func<int, bool> con) {
    if (con(i)) return act(i);
    return i;
}

int g = 22;
g = g.Dx(j => 11, z => z != 22); /* g is still 22 */ 
g = g.Dx(j => 11, z => z == 22);  /* g is now 11 */ 

您的代碼返回被調用的整數,因此兩種情況均返回g ,即22

您正在嘗試通過Action<int> act改變g的值,對嗎?

由於整數是作為值而不是引用傳遞的原始類型,因此它將不起作用,因此實際上您沒有為g分配任何值。

暫無
暫無

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

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