Parametry opcjonalne
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 48 z 70.
Parametry opcjonalne pozwalają definiować wartości domyślne dla parametrów metody. Gdy wywołujący nie poda wartości dla danego parametru, automatycznie używana jest wartość domyślna.
Tworzysz opcjonalny parametr, przypisując wartość domyślną w sygnaturze metody:
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// Oba wywołania działają
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!Parametry opcjonalne muszą występować po wszystkich wymaganych parametrach. Możesz mieć wiele parametrów opcjonalnych, a wywołujący mogą pomijać dowolne z nich, zaczynając od prawej strony:
public static void CreateUser(string name, int age = 0, bool isActive = true)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
CreateUser("Emma"); // Emma, Age: 0, Active: True
CreateUser("James", 25); // James, Age: 25, Active: True
CreateUser("Sarah", 30, false); // Sarah, Age: 30, Active: FalseWartości domyślne muszą być stałymi znanymi w czasie kompilacji — literałami, wartościami const lub wyrażeniami default. Nie możesz używać zmiennych ani wywołań metod jako wartości domyślnych. Dzięki temu parametry opcjonalne idealnie nadają się do ustawień konfiguracji i metod, w których większość wywołujących używa typowych wartości.
Wyzwanie
ŁatwyStwórzmy system powiadomień, który wykorzystuje parametry opcjonalne, aby umożliwić elastyczne formatowanie wiadomości. Utworzysz klasę narzędziową, która może wysyłać powiadomienia z konfigurowalnymi ustawieniami, przy czym większość wywołujących będzie korzystać z odpowiednich wartości domyślnych.
Podzielisz kod na dwa pliki:
NotificationService.cs: Utwórz klasęNotificationServicew przestrzeni nazwNotificationsz metodą pokazującą użycie parametrów opcjonalnych:SendNotification(string message, string priority = "Normal", bool addTimestamp = true)— ta metoda powinna zwracać sformatowany ciąg powiadomienia. GdyaddTimestampma wartość true, dodaj[TIMESTAMP]przed wiadomością. W zależności od ustawienia znacznika czasu format powinien mieć postać:[Priority] Messagelub[TIMESTAMP] [Priority] Message.
Program.cs: W głównym pliku pokaż, jak działają parametry opcjonalne, wywołującSendNotificationna trzy różne sposoby — używając wszystkich wartości domyślnych, nadpisując jeden parametr i nadpisując oba parametry opcjonalne.
Otrzymasz trzy dane wejściowe:
- Pierwsza wiadomość (użyje wszystkich wartości domyślnych)
- Druga wiadomość (użyje priorytetu
"Urgent"i domyślnego znacznika czasu) - Trzecia wiadomość (użyje priorytetu
"Low"i nie będzie miała znacznika czasu)
Wywołaj SendNotification trzy razy i wypisz każdy wynik:
- Pierwsze wywołanie: przekaż tylko pierwszą wiadomość (użyje wartości domyślnych: priorytetu
"Normal"i włączonego znacznika czasu) - Drugie wywołanie: przekaż drugą wiadomość z priorytetem
"Urgent"(znacznik czasu nadal będzie domyślnie włączony) - Trzecie wywołanie: przekaż trzecią wiadomość z priorytetem
"Low"i wartościąfalsedla znacznika czasu
Na przykład, jeśli dane wejściowe to System started, Server overload i Cache cleared, wynikiem powinno być:
[TIMESTAMP] [Normal] System started
[TIMESTAMP] [Urgent] Server overload
[Low] Cache clearedZauważ, jak ta sama metoda elegancko obsługuje wszystkie trzy scenariusze — wywołujący określają tylko to, co chcą zmienić względem wartości domyślnych!
Spróbuj swoich sił
using System;
using Notifications;
class Program
{
public static void Main(string[] args)
{
// Wczytaj trzy wiadomości
string message1 = Console.ReadLine();
string message2 = Console.ReadLine();
string message3 = Console.ReadLine();
// Utwórz instancję NotificationService
NotificationService service = new NotificationService();
// TODO: Wywołaj SendNotification trzy razy i wypisz każdy wynik:
// 1. Pierwsze wywołanie: przekaż tylko message1 (używa wszystkich wartości domyślnych)
// 2. Drugie wywołanie: przekaż message2 z priorytetem "Urgent" (timestamp ma domyślnie wartość true)
// 3. Trzecie wywołanie: przekaż message3 z priorytetem "Low" i wartością false dla timestamp
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metodPoćwicz samodzielnie: Kompilator C# online