W Visual Basic .NET metody anonimowe są realizowane za pomocą wyrażeń lambda (Function lub Sub). Pozwalają one na definiowanie małych bloków kodu bez tworzenia oddzielnej nazwanej procedury. Przykład użycia:
Dim squared = Function(x As Integer) x * x Console.WriteLine(squared(5)) ' Wyjście: 25 Dim numbers = {1, 2, 3, 4} Dim evens = numbers.Where(Function(n) n Mod 2 = 0) For Each n In evens Console.WriteLine(n) Next
Zalety:
Ograniczenia:
Pytanie: „Czy można używać wyrażenia lambda do deklarowania procedury z operatorem GoTo w środku? Dlaczego?”
Poprawna odpowiedź: Nie, wyrażenia lambda w VB.NET nie pozwalają na używanie narzędzi sterujących, takich jak GoTo, GoSub czy Label. Jest to związane z cechami realizacji metod anonimowych. Próba użycia GoTo spowoduje błąd kompilacji.
Przykład kodu (wywoła błąd):
Dim broken = Sub() GoTo Label1 Label1: End Sub
Historia
W projekcie do przetwarzania danych próbowano używać wyrażeń lambda do złożonej walidacji z wieloma punktami wyjścia przez GoTo. Podczas migracji z zwykłych metod na kod lambda wystąpił błąd kompilacji, co wymusiło nagłą zmianę architektury funkcji.
Historia
Do asynchronicznych wywołań używano metod anonimowych. Wewnątrz lambda przypadkowo odwoływano się do zmiennych, które zmieniały się w pętli. Doprowadziło to do nieoczekiwanych rezultatów, ponieważ lambda „zapamiętywała” zmienną przez odniesienie, a nie wartość - wynikiem były zagadkowe błędy w raportach.
Historia
W pewnym projekcie bezpośrednio przekształcano metody anonimowe w delegaty niekompatybilnych typów (na przykład, Sub zamiast Function). Kompilator nie zgłaszał wyraźnego błędu, ale obsługiwane zdarzenia nie były wykonywane. Odkryto to dopiero podczas ręcznego testowania, co spowodowało opóźnienie wydania.