Od dawna (chyba od początku) w C# do dyspozycji mieliśmy słowo kluczowe out, służące do przekazywania parametrów na wyjście. Standardem stało się pisanie metod typu TryParse, które zwracają bool oraz wartość za pomocą parametru out, np.:
int number; bool result = Int32.TryParse(text, out number); if (result) { Console.WriteLine("Converted '{0}' to {1}.", text, number); } else { // error }
Składnia bardzo niewygodna. Trzeba było osobno deklarować zmienną przekazywaną jako out. Ponadto, funkcje takie często akceptowały kilka parametrów out. W takich sytuacjach, musieliśmy deklarować puste “kontenery” ponieważ nie było możliwości przekazania NULL albo jakieś innej wartości. W skrajny sytuacjach wyglądało to tak:
int value; // unnecessary variables int container1,container2, container3; DoSomething(out value, out container1, out container2, out container3); // do something with value
W C# 7.0 nie musimy osobno deklarować takich zmiennych i powyższy kod można przepisać do:
if (Int32.TryParse("4343", out int number)) { Console.WriteLine(number); } else { // error }
Jak widzimy, deklaracja odbywa się w wewnątrz wywołania. Po kompilacji uzyskamy klasyczny kod:
private static void Main(/*Parameter with token 08000001*/string[] args) { int result; if (!int.TryParse("4343", out result)) return; Console.WriteLine(result); }
Ze względu, że sygnatura jest z góry znana, można skorzystać ze słowa “var” zamiast deklarować jawnie typ integer:
if (Int32.TryParse("4343", out var number)) { Console.WriteLine(number); } else { // error }
Możliwe, że będzie można korzystać z wildcards czyli (nie zostało to jeszcze zatwierdzone do finalnej wersji 7.0):
static void Main(string[] args) { if (Int32.TryParse("4343", out *)) { Console.WriteLine("OK"); } else { // error } }
Byłoby to bardzo przydatne w sytuacjach, gdzie zainteresowani jesteśmy tylko jedną wartością, a sygnatura wymaga od nas podania np. 5 innych zmiennych. Niestety na dzień dzisiejszy nie jest to zaimplementowane w najnowszej wersji VS (Visual Studio 15′ Preview 4).
Jednak zatwierdzone zostało coś innego 🙂
Prawidłowym znakiem discard jest ‘_’
if (Int32.TryParse(“4343”, out _))
https://docs.microsoft.com/en-us/dotnet/csharp/discards#pattern-matching-with-switch-and-is