W Visual Basic (zarówno Classic, jak i .NET) można zadeklarować opcjonalne parametry dla procedur i funkcji, używając słowa kluczowego Optional. Możliwe jest również ustawienie wartości domyślnych dla takich parametrów.
Składnia:
Sub SendMessage(message As String, Optional urgent As Boolean = False) If urgent Then Console.WriteLine("PILNE: " & message) Else Console.WriteLine(message) End If End Sub ' Wywołania: SendMessage("Cześć!") ' urgent = False SendMessage("Ważna wiadomość!", True)
Ważne niuanse:
- Parametry
Optionalzawsze muszą być ostatnie w liście parametrów.- Jeśli brakuje wartości domyślnej dla parametru, jest ona określana jako
Nothinglub jako wartość domyślna dla typu (na przykład 0 dla Integer).- W klasycznym VB typy opcjonalne są ograniczone: nie można używać typów bez wartości domyślnej (na przykład klas niezerowych).
Pytanie: Czy można w Visual Basic zadeklarować obowiązkowy parametr po opcjonalnym (Optional)? Wyjaśnij, dlaczego (nie/tak) i jak tego unikać.
Odpowiedź: Nie, po zadeklarowaniu co najmniej jednego parametru jako Optional, wszystkie następne parametry muszą również być zadeklarowane jako Optional. To jest wymóg składni, aby uniknąć zamieszania przy przekazywaniu parametrów według pozycji.
Przykład błędnego kodu:
Sub PrintReport(Optional pageSize As String = "A4", copies As Integer) ' Błąd kompilacji: obowiązkowe parametry nie mogą iść po opcjonalnych End Sub
Aby to naprawić — zmień kolejność parametrów:
Sub PrintReport(copies As Integer, Optional pageSize As String = "A4") ' Poprawna wersja End Sub
Historia
Na dużym projekcie klient dodał opcjonalny parametr do procedury udostępniania plików, zapominając o jego wymaganej wartości domyślnej. W wyniku tego, przy wywołaniu metody bez podania parametru, było przetwarzane
Nothingjako nazwa pliku, co powodowało błąd ładowania.
Historia
W wyniku skopiowania sygnatury metody z innego systemu, kolejność parametrów została naruszona — obligatoryjny parametr znalazł się po
Optional. Programista naprawił błąd kompilacji, jedynie zmieniając kolejność, ale we wszystkich wywołaniach nie uwzględnił, że teraz numeracja się przesunęła. To spowodowało nieprawidłowe działanie funkcji w ponad 30 miejscach kodu.
Historia
Aby skrócić ilość kodu, podjęto decyzję o przypisaniu pustego ciągu jako wartości domyślnej dla parametru tekstowego. Jednak w niektórych przypadkach przetwarzanie pustej wartości różniło się od przetwarzania pominiętego parametru, co prowadziło do nielogicznej logiki działania dialogu — zamiast wyświetlenia standardowego tekstu, dochodziło do ukrycia formularza bez wyjaśnień.