语法澄清使用“=>”

时间:2015-10-13 07:16:11

标签: c# lambda

有人可以用简单的英语告诉我以下代码中发生了什么,特别是=>+=符号的用法:

var ls = new LibraryServiceClient(AppSettings.Get("LibraryServiceBaseAddress"), 
                                  SessionId, App.Id, _user.UUID);
ls.MakingRequest += (s, e) =>
{
    LogStash.LogDebug("Library Service | Before making request  : {0}",
    DateTime.UtcNow.ToString("HH:mm:ss.fff"));
};

3 个答案:

答案 0 :(得分:7)

您为活动分配了新的代表:

ls.MakingRequest +=

您创建一个lambda表达式,一个具有两个参数se的函数:

 (s, e) =>

lambda表达式的动作是:

{ LogStash.LogDebug("Library Service | Before making request  : {0}", DateTime.UtcNow.ToString("HH:mm:ss.fff"));

答案 1 :(得分:6)

(s,e) => { /*expresion*/ }

是一个lambda函数。

它的类型是Action<object, EventArgs>

ls.MakingRequest

是一个事件。

使用+=,您可以为此事件注册处理程序。 当事件被触发时,所有已注册的处理程序都将执行。

处理程序与操作具有相同的签名 - 它需要object发件人和EventArgs eventArgs并返回void。 因此,lambda函数类型是兼容的,因此在触发事件时将调用它。

答案 2 :(得分:2)

使链式扩展方法看起来更具可读性是一种语法糖。

下面的代码将解释它的演变:

public class Program
{
    public void Main(string[] args)
    {
        // named delegate
        Tasker t = new Tasker();
        t.doer += DoProvider.DoThis;
        t.CallDoer("I am doing something");

        // anonymous method
        Tasker t2 = new Tasker();
        t2.doer += delegate(string s){
            Console.WriteLine (s);
        };
        t2.CallDoer("I am doing something again");

        // syntactical sugar over anonymous methods aka lambda expressions
        Tasker t3 = new Tasker();
        t3.doer += (s)=>{
            Console.WriteLine (s);
        };
        t3.CallDoer("I am doing yet another thing");
    }
}


public delegate void DoSomething(string Foo);

public class Tasker
{
    public event DoSomething doer;

    public void CallDoer(string s)
    {
        doer.Invoke(s);
    }
}

public static class DoProvider
{
    public static void DoThis(string Bar)
    {
        Console.WriteLine (Bar);
    }
}
相关问题