Pattern-ul pozițional
Pattern-ul pozițional se aplică unui tip care are definită o metodă deconstructor. De exemplu, să definim următoarea clasă:
class MessageDetails
{
public string Language { get; set; } = ""; // limba utilizatorului
public string DateTime { get; set; } = ""; // timpul zilei
public string Status { get; set; } = ""; // statutul utilizatorului
public void Deconstruct(out string lang, out string datetime, out string status)
{
lang = Language;
datetime = DateTime;
status = Status;
}
}
Acum folosim pattern-ul pozițional și în funcție de valorile obiectului MessageDetails vom returna un anumit mesaj:
string GetWelcome(MessageDetails details) => details switch
{
("english", "morning", _) => "Good morning",
("english", "evening", _) => "Good evening",
("german", "morning", _) => "Guten Morgen",
("german", "evening", _) => "Guten Abend",
(_, _, "admin") => "Hello, Admin",
_ => "Bună"
};
De fapt, acest pattern este similar cu exemplul cu tupluri de mai sus, doar că acum în construcția switch este transmis un obiect MessageDetails. Prin metoda deconstructor putem obține un set de parametri de ieșire sub formă de tuplu și, din nou, să-i comparăm cu anumite valori în construcția switch.
Aplicare:
MessageDetails details1 = new MessageDetails { Language = "english", DateTime = "evening", Status = "user" };
string message = GetWelcome(details1);
Console.WriteLine(message); // Good evening
MessageDetails details2 = new MessageDetails { Language = "french", DateTime = "morning", Status = "admin" };
message = GetWelcome(details2);
Console.WriteLine(message); // Hello, Admin
De asemenea, putem lua valorile obiectului MessageDetails și să le folosim la crearea rezultatului metodei:
string GetWelcome(MessageDetails details) => details switch
{
("english", "morning", _) => "Good morning",
("english", "evening", _) => "Good evening",
("german", "morning", _) => "Guten Morgen",
("german", "evening", _) => "Guten Abend",
(_, _, "admin") => "Hello, Admin",
(var lang, var datetime, var status) => $"{lang} not found, {datetime} unknown, {status} undefined",
_ => "Bună"
};
În penultima instrucțiune din construcția switch obținem pe poziție valorile din MessageDetails în variabilele lang, datetime și status și le folosim pentru a crea mesajul:
MessageDetails details1 = new MessageDetails
{
Language = "chinese",
DateTime = "night",
Status = "moderator"
};
string message = GetWelcome(details1);
Console.WriteLine(message); // chinese not found, night unknown, moderator undefined