c# - 使用 Action<> 委托(delegate)时 int 递增的奇怪行为

标签 c#

给定以下代码:

class Sample
{
 public static void Run()
 {
     int i = 1;
     Action<int> change = Increment();
     for (int x = 0; x < 5; x++ )
     {
         change(i);
         Console.WriteLine("value=" + i.ToString());
     }
 }

 public static Action<int> Increment()
 {
      return delegate(int i) { i++; };
 }

}

我得到了答案:

值=1 值=1 值=1 值=1 值=1 值=1

而不是 1、2、3 ... 6。

这是来自网络上的一篇文章,其中包含指向线索的链接,但我不明白为什么会这样。有人有什么想法吗?

最佳答案

您的参数正在按值传递。

编写 i++ 会将 i 的值更改为不同的 int 值(与可变类型不同)。
当您在委托(delegate)中编写 i++ 时,您正在将参数更改为等于不同的 int 值。但是,这不会影响其值被复制到参数的局部变量。

要解决这个问题,您需要创建一个带有ref 参数的委托(delegate)。 ref 参数通过引用传递。因此,当您将 ref int 参数更改为不同的 int 值时,您也会更改传递给其 reference 的局部变量或字段作为参数。

有关详细信息,请参阅 here .

由于 Action 委托(delegate)不接受 ref 参数,您需要创建自己的委托(delegate)类型,如下所示:

delegate void RefAction<T>(ref T param);

关于c# - 使用 Action<> 委托(delegate)时 int 递增的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2233102/

相关文章:

c# - 在 MYSQL 中插入 TIMESTAMP 数据?错误 "MYSQL version for the right syntax to use near etc"

来自 native C++ 加载的 DLL 的 C# 形式

c# - 我是一个初学者,我无法解决C#代码中的一些错误

C# 检测在运行时第二次运行应用程序期间更改了哪些 C# (.cs/poco) 文件

c# - 如何判断一个点是否在某条线附近?

c# - 缩放转换文本 block

c# - MySQL 可以安装为带有离线应用程序的嵌入式数据库吗?

c# - 返回错误 : not all code paths return a value

c# - Linq 搜索不返回所有条目

c# - MVVM + 中介模式 : Registration of Mediator occurs too late