Func <T> () - Func <T> .Invoke ()


83

Doğrudan bir Func çağırma ile üzerinde Invoke () kullanma arasındaki farkları merak ediyorum. Bir fark var mı ? İlk, sözdizimsel şeker mi ve yine de Invoke () çağırıyor mu?

public T DoWork<T>(Func<T> method)
{
    return (T)method.Invoke();
}

vs

public T DoWork<T>(Func<T> method)
{
    return (T)method();
}

Yoksa tamamen yanlış yolda mıyım :) Teşekkürler.


Yanıtlar:


113

Hiç fark yok. İkincisi, Invokederleyici tarafından sağlanan için sadece bir kısaltmadır . Aynı IL'ye derlerler.


1
Invoke () yönteminin kapalı bırakılması derleyici hatasına neden oluyor: "'System.Func <T>' türü örtülü olarak 'T' olarak dönüştürülemez." .NET 4'e karşı derliyorum.
Mike

2
@Mike: Eğer parantezleri de kaçırırsan - yani geri dönmek (T)methodyerine geri dönmeyi deneseydin bu olurdu (T)method().
Jon Skeet

@JonSkeet Yani burada bu adam yanlış olduğunu: social.msdn.microsoft.com/Forums/en-US/...
superlogical

4
@superlogical: Burada iki sorun var. İlk olarak, oradaki soru, bir yöntemi doğrudan çağırmakla onu bir temsilci aracılığıyla çağırmak arasındaki farkla ilgilidir. Bu , temsilci türünün bir değişkeni arasındaki foo()ve foo.Invoke()nerede fooolduğu ile aynı şey değildir . Diğer sorun, cevabın bahsediyor gibi görünmesidir Control.Invoke, ki bu Invokebir temsilciyi aramakla aynı şey değildir .
Jon Skeet

2
@LucaCremonesi: Bir yöntem çağrısının sonucuysa Invoke, GetAction()()tuhaf göründüğü için genel olarak hoşuma gidiyor , ama iyi GetAction().Invoke()görünüyor. Ama çoğunlukla umursamıyorum.
Jon Skeet

17

Invoke, yeni C # 6 boş yayılma operatörü ile iyi çalışır, şimdi yapabilirsiniz

T result = method?.Invoke();

onun yerine

T result = method != null ? method() : null;

Bunun yararlı olduğu bir senaryo gösterebilir misiniz? Ders kitabı vakası olayları artırıyor.
Gusdor

1
Örneğin, herhangi bir değer atanmamışsa, boş olan ve yok sayılacak varsayılan (Func) olan isteğe bağlı bir Func parametreniz olabilir.
Austin Salgat

1
Olaylar ve diğer çoklu kullanım delegeleri için yaygın bir durumdur - bunlar genellikle null ile başlatılır ve çağrıdan sonra boş olmayan bir değer kazanır +=. Bu nedenle, bir etkinliği ateşleyecekseniz ve herhangi bir abonelik olup olmadığını bilmiyorsanız, kısa çözüm aramaktır ?.Invoke(...).
stop-cran
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.