委托和变量范围

2024-04-18

我有以下代码:

public void SetMove(Position3D pos, float time, float linearity, bool relative)
{
    ExecuteOnActiveClients(delegate(NeuroClient client)
                               {
                                   client.Engine.GetProcAnimation(name).SetMove(pos, time, linearity, relative);
                               }, true, true);
}

其中 ExecuteOnActiveClients 将委托推送到队列中,异步使用,并具有以下签名:

void ExecuteOnActiveClients(ClientDelegate action, Boolean parallel, Boolean wait, Boolean lockClient)

我有很多类似这个的函数,并且可以同时调用。

我注意到我必须存储的值name(这是类的私有字段)在我执行 ExecuteOnActiveClients 之前函数中的变量中以使此代码正常工作,因为如果我不这样做,委托将使用最后一个值name,而不是调用函数时字段的值。

我猜这是一个范围问题,因为函数的参数(位置、时间、线性和相对)是正确的。

有没有办法强制委托使用的值name它被创建的时间,而不是它的值name什么时候执行?

我想避免将值存储在每个使用的函数中在活动客户端上执行如果可能的话。

提前致谢

Mike


目前委托没有存储以下值name根本不。它正在捕捉this,然后用它来解决this.name每当你提到它的时候。

这就是匿名方法和 lambda 表达式的工作方式,您无法改变它们的行为:创建局部变量is解决方法。 (这仍然会捕获该变量而不是其当前值,但您大概可以确保之后不会更改局部变量的值。)

要了解更多信息,以及您很容易陷入的另一个陷阱,我强烈建议您阅读 Eric Lippert 的博客文章“Closing over theloopvariablethoughtvalent”(part 1 http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx, part 2 http://blogs.msdn.com/b/ericlippert/archive/2009/11/16/closing-over-the-loop-variable-part-two.aspx).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

委托和变量范围 的相关文章

随机推荐

  • 从 C 代码获取当前使用的文件描述符的计数

    是否有 C API 可以获取 系统范围内当前使用的文件描述符 当前进程当前使用的文件描述符 对于当前进程计数 您可以使用getrlimit获取文件描述符限制 然后迭代从 0 到该限制的所有整数并尝试调用fcntl与F GETFD命令 它只会
  • PubNub:将所有已发布消息记录到我的数据库的正确方法是什么

    记录每条已发布消息并将其保存到我的服务器数据库的正确方法是什么 我能想到的有两种选择 使用PubNub功能发布事件后并将消息转发到专用记录器通道 服务器将订阅该频道并将到达的消息保存到数据库 这里又产生一个问题 当我在PubNub函数中将消
  • 使用 ActiveRecord 和 Rails 3 进行复杂 JOIN

    我有以下型号 class User lt ActiveRecord Base has many memberships has many groups through gt memberships end class Group lt Ac
  • 如何在 C# 中旋转标签? [复制]

    这个问题在这里已经有答案了 我想显示一个旋转 90 度的标签 这样我就可以将它们中的一堆作为标题放在表格的顶部 是否有捷径可寻 您需要编写自己的控件或使用自定义控件 A 代码项目 http en wikipedia org wiki The
  • Qt 和 Google 地球 API

    是否可以使用 Google Earth 在 Qt 中开发应用程序 例如 我想在我的应用程序中通过 QtGL 将地球 如谷歌地球 显示为球体 很明显 您可以在 Qt 中使用 google Earth api 我想分享一个秘密 Google E
  • AABB 碰撞解决滑动边

    因此 我目前正在重新发明轮子 并学到很多东西 尝试为我的游戏引擎制作一个简单的物理引擎 我一直在互联网上搜索 尝试 但失败 解决我当前的问题 关于这个主题有很多资源 但我发现的资源似乎都不适用于我的情况 问题简而言之 当两个矩形碰撞时 碰撞
  • 如何对选择器输入中的选项进行文本换行,如果选项的长度很长,则选项通常会出现在屏幕之外

    pickerInput 中的选择始终位于单行中 有没有办法可以将它们带到下一行 当选择的长度很长导致选择超出屏幕时 这是一个问题 我特别需要 pickerInput 因为它具有实时搜索 全选 取消全选功能 library shiny lib
  • gcc -lpthread 不工作

    我的系统中安装了 ubuntu 11 我有一个使用 pthread 库的 C 程序 我收到错误Undefined reference to sem wait 即使我已经用标志编译了 lpthread 例如 gcc lpthread prog
  • 如何在 drools 规则引擎中动态更新规则

    我正在开发 drools 规则引擎 在这个场景中将 when 块中的值从 1000 更改为 2000 将符号从 gt 更改为 rule payment when account Paymentinfo transaction lt 1000
  • 使用python将数据写入谷歌云存储

    我找不到使用 python 将本地计算机中的数据集写入谷歌云存储的方法 我进行了很多研究 但没有找到任何与此相关的线索 需要帮助 谢谢 简单的例子 使用谷歌云 https googlecloudplatform github io goog
  • 使用 GTK 构建 GUI#

    我可能需要使用 C 和 Mono 构建 GTK GUI 如果我理解正确的话 这意味着我有3个选择 编写 C 代码来调用 GTK 包装器类 GUI 是 在代码中 使用 MonoDevelop GUI 设计器 这使用 stetic 标记构建了一
  • 在 Xamarin.Forms 中编写设备平台特定的代码

    我有以下内容Xamarin Forms ContentPage类结构 public class MyPage ContentPage public MyPage do work to initialize MyPage public voi
  • 在 Apps 脚本上创建新触发器时收到错误

    尝试创建新触发器时收到此错误 脚本授权失败 请检查您的弹出窗口阻止程序设置 然后重试 已尝试允许该网站接受弹出窗口 甚至关闭弹出窗口阻止程序 但没有产生任何影响 有人有解决办法吗 我遇到了同样的问题 并设法通过首先从脚本编辑器手动执行我的脚
  • PHP 7 用户会话问题 - 无法初始化存储模块

    在 PHP 7 0 中使用各种 PHP 框架会话驱动程序时存在错误 我最初在使用 CodeIgniter 数据库驱动程序时遇到了这个问题 并认为这是一个 CodeIgniter 问题 但后来在多个会话驱动程序和多个框架上遇到了这个问题 此时
  • 在android中使用多点触控进行旋转、缩放和移动

    我想在多点触摸事件上旋转 缩放和移动图像 它似乎工作正常 但工作不完美 我真的很想修复我的错误代码 所以请帮助我 我的代码在那里 public class ImageControl extends Activity DragView dra
  • 使用 Selenium IDE 解析查询字符串值的 URL

    我是集成测试的新手 但到目前为止 我已经使用 Se IDE 构建了一套测试 取得了巨大的成功 当我运行测试时 我突然意识到我正在生成大量数据 并且我想自己清理 我的大多数测试都涉及创建一个新的 页面 并且 id 在查询字符串中可用 我想让
  • __doPostBack() 函数不起作用 (asp.net)

    我正在尝试从 JS 代码触发按钮事件 但doPostBack在JS函数中reg 不指向 c 代码 请告诉我出了什么问题 这是我的代码
  • 正则表达式返回未定义的字符串

    我试图从磁力链接中提取哈希值 但它返回不明确的 var tesst magnet xt urn btih 2B78EDFDDC87DC9605FB285997A80B787888C194 var test tesst match magne
  • 当文本框为空时,C++ Windows 窗体应用程序出现未处理的异常错误

    我正在 Visual Studio 中为 C 课程构建温度转换应用程序 它是一个 Windows 窗体应用程序 我的问题是 当我运行应用程序时 如果我没有在 txtFahrenheit 或 txtCelsius2 文本框中输入任何内容 我会
  • 委托和变量范围

    我有以下代码 public void SetMove Position3D pos float time float linearity bool relative ExecuteOnActiveClients delegate Neuro