Moh*_*kar 0 .net c# action func
这是我的代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
后来在我的代码中我做了:
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
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
Eri*_*ert 16
迄今为止给出的答案都不是实际的解释.
到目前为止给出的一些答案表明这是因为int是值类型.尝试在此程序int中用objects 替换所有s .它是否像原始海报所期望的那样开始工作?不.那么它与值类型和引用类型无关.
相反,它与变量的值有关,无论其类型如何.
Mahdi,您的期望是形式参数j成为形式参数的别名,而形式参数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);
Run Code Online (Sandbox Code Playgroud)
"参考"关键字的意思是g,i和j是同一变量的所有不同的名字.
正如D斯坦利所说,这可能是糟糕的风格.而不是改变方法中的变量,而是返回您希望将其更改为的值,并让调用者决定要变异的变量(如果有).
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |