Action(arg)和Action.Invoke(arg)之间的区别

lab*_*roo 27 c#

static void Main()
{
    Action<string> myAction = SomeMethod;

    myAction("Hello World");
    myAction.Invoke("Hello World");
}

static void SomeMethod(string someString)
{
    Console.WriteLine(someString);
}
Run Code Online (Sandbox Code Playgroud)

上面的输出是:

Hello World
Hello World
Run Code Online (Sandbox Code Playgroud)

现在我的问题是

  • 如果有的话,调用Action的两种方法有什么区别?

  • 这个比那个好吗?

  • 何时使用哪个?

谢谢

SLa*_*aks 31

所有委托类型都有编译器生成的Invoke方法.
C#允许您将委托本身作为调用此方法的快捷方式.

他们都编译到同一个IL:

C#:

Action<string> x = Console.WriteLine;
x("1");
x.Invoke("2");
Run Code Online (Sandbox Code Playgroud)

IL:

IL_0000:  ldnull      
IL_0001:  ldftn       System.Console.WriteLine
IL_0007:  newobj      System.Action<System.String>..ctor
IL_000C:  stloc.0     
IL_000D:  ldloc.0     
IL_000E:  ldstr       "1"
IL_0013:  callvirt    System.Action<System.String>.Invoke
IL_0018:  ldloc.0     
IL_0019:  ldstr       "2"
IL_001E:  callvirt    System.Action<System.String>.Invoke
Run Code Online (Sandbox Code Playgroud)

(ldnull用于打开委托中的target参数)

  • 不,他们都编译到同一个IL.一个是另一个的简写.我能看到的唯一*可能的好处是你可以检查null并在使用`invoke`时使用更新的c#特性来调用它,例如`x?.Invoke("1")`只有当它不是null时才调用委托. (8认同)