这种方法
o => _server.Connect()
个
与此方法相同
void Anon(object o)
{
// argument o is ignored
_server.Connect();
}
使此代码等同于您的代码:
private Server _server;
public RelayCommand ConnectToServerCommand {get; set;}
// un-lambda-ed
void Anon(object o)
{
_server.Connect();
}
public MainViewModel() // constructor
{
_server = new Server();
// no confusion
ConnectToServerCommand = new(Anon);
}
让我们在构造函数中有两个调用:
public MainViewModel() // constructor
{
_server = new Server();
ConnectToServerCommand = new(o => _server.Connect());
// no confusion
ConnectToServerCommand = new(Anon);
}
然后比较生成的中间语言:
MainViewModel:
IL_0000: ldarg.0
IL_0001: newobj UserQuery+Server..ctor
IL_0006: stfld UserQuery._server // _server = new Server();
IL_000B: ldarg.0
IL_000C: ldarg.0
IL_000D: ldftn UserQuery.<MainViewModel>b__0 // our lamda function, see below
IL_0013: newobj System.Action<System.Object>..ctor
IL_0018: newobj UserQuery+RelayCommand..ctor
IL_001D: call UserQuery.set_ConnectToServerCommand
IL_0022: ldarg.0
IL_0023: ldarg.0
IL_0024: ldftn UserQuery.Anon // our Anon call
IL_002A: newobj System.Action<System.Object>..ctor
IL_002F: newobj UserQuery+RelayCommand..ctor
IL_0034: call UserQuery.set_ConnectToServerCommand
IL_0039: ret
<MainViewModel>b__0: // generated by the compiler for us, the lambda
IL_0000: ldarg.0 // object o, nothing gets done with that
IL_0001: ldfld UserQuery._server
IL_0006: callvirt UserQuery+Server.Connect
IL_000B: ret
Anon:
IL_0000: ldarg.0 // object o, nothing gets done with that
IL_0001: ldfld UserQuery._server
IL_0006: callvirt UserQuery+Server.Connect
IL_000B: ret
这是惊人的相似.