c# 7.0: Parametry wyjściowe

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).

Leave a Reply

Your email address will not be published.