[英]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
的更改,因為它們是相同的變量。 事實並非如此。 j
, i
和g
是相同值的副本,但具有不同的存儲位置 ,因此,使一個變量不變就不會使另一個變量突變。
在C#中,您說“此形式參數是此變量的別名”的方式是使用ref
或out
關鍵字。 因此,該程序可以實現您的期望:
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”關鍵字表示g
, i
和j
都是同一變量的不同名稱。
正如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.