有人可以用简单的英语告诉我以下代码中发生了什么,特别是=>
和+=
符号的用法:
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"));
};
答案 0 :(得分:7)
您为活动分配了新的代表:
ls.MakingRequest +=
您创建一个lambda表达式,一个具有两个参数s
和e
的函数:
(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);
}
}