C#’owe parametry ref i out dla Visual Basic

Dziasiaj opiszę przekazywanie parametrów przez referencje w C# i Visual Basic.
W C# robi sie to z użyciem słowa kluczowego ref (również out, ale skupię się na ref).

public static void Bar(ref string[] names)
{
    // We can assign value to parameter names
    names = new string[] {"Kate"};
}

static void Main(string[] args)
{
    var names = new string[] { "ala", "ma", "kota" };
    Bar(ref names);
}

Analogicznie w Visual Basic napisalibyśmy to w następujący sposób:

Public Shared Sub Bar(ByRef names As String())
	' We can assign value to parameter names
	names = New String() {"Kate"}
End Sub

Private Shared Sub Main(args As String())
	Dim names = New String() {"ala", "ma", "kota"}
	' calkowity brak informacji o tym ze przekazujemy przez referencje
	Bar(names)
End Sub

A teraz sedno, czyli dlaczego kompilator VB nie pomaga tak jak C#. Gdy próbujemy przekazać do takiej funkcji pole, które jest readonly to w C# dostajemy całkiem logiczny error:

    public class MyClass
    {
        private readonly int[] numbers;

        public void Foo()
        {
            // Error: A readonly field cannot be passed ref or out (except in a constructor)
            Array.Resize<int>(ref numbers, 5); 
        }
    }

Niestety w Visual Basic nie zostaniemy ostrzeżeni w żaden sposób. Wykonanie tej metody nie spowoduje również, że tablica numbers będzie miała 5 elementów.

    Public Class [MyClass]
        Private ReadOnly numbers As Integer()

        Public Sub Foo()
            ' No error or warning
            Array.Resize(Of Integer)(numbers, 5)
        End Sub
    End Class

Ogólna rada „wystrzegaj się słowa kluczowego ByRef w Visual Basic”. W C# trzeba parametr funkcji zadeklarować z ref lub out, a co za tym idzie również w wywołaniu takiej funkcji trzeba użyć ref lub out dla przekazywanych parametrów.
Btw to używanie out jest niezalecane przez FxCop. Bardzo dobrze. Jedyne dobre zastosowanie jakie widzę to TryParse(out …).

Advertisements
Ten wpis został opublikowany w kategorii Programowanie i oznaczony tagami , , . Dodaj zakładkę do bezpośredniego odnośnika.