首页 / C# / c# – 代理和变量范围
c# – 代理和变量范围
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 代理和变量范围,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1232字,纯文字阅读大概需要2分钟。
内容图文
我有以下代码:
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)
我有很多看起来像这个的函数,可以同时调用.
我注意到在执行ExecuteOnActiveClients之前我必须在函数的变量中存储name的值(这是类的私有字段)才能使这段代码正常工作,因为如果我不这样做,委托使用最后一个name的值,而不是调用函数时字段的值.
我想这是范围问题,因为函数的参数(pos,time,linearity和relative)是正确的.
有没有办法强制委托在创建时使用name的值,而不是在执行时使用name的值?
我想避免在可能的情况下将值存储在使用ExecuteOnActiveClients的许多函数中.
提前致谢
麦克风
解决方法:
目前,委托根本不存储名称的值.它正在捕获它,然后在你引用它时使用它来解析this.name.
这是匿名方法和lambda表达式的工作方式,并且您无法改变其行为:创建局部变量是变通方法. (这仍将捕获该变量而不是其当前值,但您可以确定之后不会更改局部变量的值.)
有关更多信息以及您可以轻易陷入的其他陷阱,我建议您阅读Eric Lippert关于“关闭循环变量被认为有害”的博客文章(part 1,part 2).
内容总结
以上是互联网集市为您收集整理的c# – 代理和变量范围全部内容,希望文章能够帮你解决c# – 代理和变量范围所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。