Подтвердить что ты не робот

Разница между Action (arg) и Action.Invoke(arg)

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

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

static void SomeMethod(string someString)
{
    Console.WriteLine(someString);
}

Выход для выше:

Hello World
Hello World

Теперь мой вопрос (ы)

  • В чем разница между двумя способами вызова Action, если таковые имеются?

  • Один лучше другого?

  • При использовании, которое?

Спасибо

4b9b3361

Ответ 1

Все типы делегатов имеют метод Invoke, созданный компилятором.
С# позволяет вызывать сам делегат как ярлык для вызова этого метода.

Они оба скомпилируются с тем же IL:

С#:

Action<string> x = Console.WriteLine;
x("1");
x.Invoke("2");

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

(ldnullдля параметра target в открыть делегат)