2017-01-03 11 views

Odpowiedz

6

Nie, nie ma różnicy funkcjonalnej między nimi. Jest tylko niewielka różnica w implementacji, nie ma się czym martwić. Skorzystaj ze składni, którą preferujesz, aby była czytelna, a większość osób preferowałaby urywek (2).

Pewne kursy, że fragment (1) został napisany przez programistę C#. Pierwszy argument BeginInvoke to System.Delegate, który jest podstawową klasą wszystkich typów delegatów. C# wymaga, abyś używał określonego typu delegata, ponieważ jest to język bardzo silnie bezpieczny dla typu. Ale VB.NET ma reputację (prawie) bycia dynamicznym językiem i nie ma takiego samego popytu, nawet z Option Strict On w efekcie.

Polecam użyć narzędzia ildasm.exe do obejrzenia wygenerowanego kodu dla obu instrukcji. Zobaczysz, że produkują dokładnie ten sam kod. Tylko jedna bardzo mała różnica: kompilator używa innego typu delegata. Koniecznie tak, ponieważ nie ma specjalnej wiedzy o MethodInvoker. Ten typ delegata jest generowany automatycznie z wyrażenia lambda i ma wygrawaną nazwę, taką jak VB$AnonymousDelegate_0. Ten może dać kompilatorowi just-in-time nieco więcej pracy, zakładając, że konsekwentnie używasz MethodInvoker i nie korzystasz z Ngen. Bardzo trudne do zakwalifikowania i niemożliwe do dokładnego zmierzenia. To tylko jednorazowy koszt i nie ma się czym martwić.

Kolejnym szczegółem jest bezpieczeństwo typu, jakiego wymaga C#. Można celowo złamać kod za pomocą, powiedzmy, Sub(arg As Integer) dla wyrażenia lambda. Spowoduje to awarię programu w czasie wykonywania, ponieważ argument arg jest niedostępny. Jeśli użyjesz MethodInvoker, dostaniesz błąd podczas kompilacji. To lepsze niż próba debugowania błędu runtime. Jest jednak równie prawdopodobne, że zmienisz typ delegata na Action(Of Integer) i nadal będzie się on zawieszał.

I nie, nie trzeba (i nie należy) wywoływać funkcji EndInvoke(). Metody te nie mają bardzo dobrych nazw, ponieważ powodują, że wyglądają one zbyt podobnie do metod typu delegata. To trochę błąd w projektowaniu. Znajdź nitty-gritty w this answer.

+0

Dziękuję Hans ... To było bardzo wyjaśniające ... i dzięki Cody za edycje ... :) – Khan

Powiązane problemy