【问题标题】:C#: meaning of statement... Action wrappedAction = () =>C#:语句的含义... Action WrappedAction = () =>
【发布时间】:2010-12-17 02:22:40
【问题描述】:

看到代码here。谁能告诉我这是什么意思?

    Action wrappedAction = () => 
    { 
        threadToKill = Thread.CurrentThread; 
        action(); 
    }; 

我们可以用.net v2.0 编写这样的代码吗...?

【问题讨论】:

  • 请注意...这将是 C# 3.0 语法,需要 .NET 3.5,但是,请回想 C# 3.0 附带 .NET 3.5,而 .NET 3.5 实际上只是附加的库仍然基于 CLR v2.0 构建。
  • FWIW,C# 3.0 语法至少需要 .NET 2.0 框架。项目设置决定它是为 2.0 还是 3.5 框架编译的。

标签: c#-3.0


【解决方案1】:

这意味着wrapAction是一个委托,不接受任何参数并且执行以下代码块

  threadToKill = Thread.CurrentThread; 
  action();

相当于

public delegate void wrapActionDel(); 

public void wrapAction()
{
      threadToKill = Thread.CurrentThread; 
      action();
}

public void CallwrapAction()
{
   wrapActionDel del = wrapAction;
   del ();
}

您可以看到这是冗长的,但Action 不是。

而且,这仅在 .Net 3.5 中可用。不用担心,您的 .net 2.0 代码将与 .net 3.5 无缝协作,因此您只需升级即可。

【讨论】:

  • +1,重新升级,没想到这么多人不这么想。
  • @Mark:重新升级:记住“让代码运行”只是升级过程的一部分。其他部分有:更新部署流程(较新的框架)、更新系统需求(不再支持W2k)、更新开发环境(VS 2005 -> 2008)等
  • 你为什么是 += 代表,这不是一个事件。你会想要“新”代表
  • @CSharpAtl,两者都可以。你可以安装 Resharper,它会建议我提出的方法。
  • 你可以wrapActionDel del = wrapAction; 但不能+= 然后调用它为del();
【解决方案2】:

这是一个 lambda 表达式,仅在 C# 3.0+ 中可用。该代码的 C# 2.0 版本如下所示:

Action wrappedAction = delegate() 
{ 
    threadToKill = Thread.CurrentThread; 
    action(); 
};

假设您之前已经声明了 Action 委托。

【讨论】:

  • 这是语法糖,不是框架魔法。因此,应阅读“...仅在 C# 3.0+ 中可用。C# 2.0 版本...”
猜你喜欢
  • 2014-05-16
  • 2011-09-03
  • 2018-02-09
  • 1970-01-01
  • 2023-03-28
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
相关资源
最近更新 更多