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