Czy VB.NET ma bezpośredni odpowiednik out
parametrów funkcji C # , gdzie zmienna przekazana do funkcji nie wymaga inicjalizacji?
Odpowiedzi:
Nie, out
w języku VB nie ma odpowiednika słowa kluczowego.
Jednak VB automatycznie inicjalizuje wszystkie zmienne lokalne w metodzie, więc możesz ich użyć ByRef
bez konieczności jawnej inicjalizacji zmiennej.
Przykład:
Sub Main()
Dim y As Integer
Test(y)
End Sub
Sub Test(ByRef x As Integer)
x = 42
End Sub
(Jeśli zbadasz kod w ramach (na przykład Double.TryParse ), możesz zobaczyć <OutAttribute>
dodane do parametrów, ale ma to znaczenie tylko wtedy, gdy wywołanie jest zorganizowane dla międzyoperacyjności COM lub wywołania platformy.)
ByRef
parametrów. (Nie dzieje się tak z parametrami typu wartości.)
Nothing
do nich pozbędzie się ostrzeżenia, chociaż nie zmienia to wyniku.
Nothing
do tej pory przypisywałem im zadania . Jest to po prostu czasochłonne, ponieważ muszę to robić setki razy w dużej, starszej witrynie internetowej. Dziękuję za zbadanie.
Out
atrybut nie jest równoważny ze out
słowem kluczowym C # .
Nie, nie ma równoważnej konstrukcji, która umożliwia przekazanie niezainicjowanej zmiennej do metody bez ostrzeżenia, ale, jak wspomniano w moim pytaniu i odpowiedzi, określając <Out()>
atrybut w ByRef
definicji parametru, chociaż VB go ignoruje, jest traktowany przez C # jako out
parametr.
Tak więc wstępnie zainicjowałbym zmienne referencyjne Nothing
i określiłem je, <Out()> ByRef
aby zaznaczyć zamiar (to zadziała, jeśli użytkownicy C # kiedykolwiek uzyskają dostęp do twoich metod).
Jeśli czujesz, że wiesz, kiedy zamierzasz uzyskać dostęp do wartości domyślnych Nothing
w innych nieprzypisanych zmiennych referencyjnych, możesz ustawić opcję „Konfiguracja ostrzeżenia” „Użycie zmiennej przed przypisaniem” na „Brak” na poziomie projektu (Właściwości projektu> Kompiluj i prawdopodobnie chcesz ustawić konfigurację na „Wszystkie konfiguracje” przed zmianą tego ustawienia) lub w VS2015 (VB.NET 14) możesz użyć #Disable Warning BC42030
.
Wersja C #
void TestFunc(int x, ref int y, out int z) {
x++;
y++;
z = 5;
}
Wersja Vb.net
Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
x += 1
y += 1
z = 5
End Sub
Aktualizacja
Jak stwierdzono w komentarzu, nie zapomnij zainicjować parametru, który będzie używany w gnieździe wyjściowym
Miałem problem w VB.NET, że nazwałem funkcję „by ref”, która przekazała tablicę z powrotem.
Mimo że kompilator oznaczył to jako ostrzeżenie, było w porządku. Poprawka jest super prosta i prawdopodobnie dobra praktyka programistyczna.
Zmieniłam
Dim m_arr_values() as Integer
fnRetArray(m_arr_values)
do
' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing
fnRetArray(m_arr_values)
Jest to również pomocne podczas kodowania, jeśli nazwy zmiennych są opisowe ...
Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
...
End Sub
Możesz użyć metody przekazywania przez odwołanie w VB.NET.
Potrzebujesz mechanizmu parametrów Out w C #, ponieważ nie pozwala on na użycie żadnej zmiennej bez jej zainicjowania.
VB.NET nie potrzebuje specjalnego słowa kluczowego, ponieważ robi to automatycznie.
Po prostu użyj ByRef.
VB ma atrybut, który powinien być taki sam jak C # out, ale dziś nadal otrzymujesz ostrzeżenie, nawet jeśli go używasz. Szczegółowe informacje na temat jego naprawiania znajdują się w obszarze vblang na githubie. https://github.com/dotnet/vblang/issues/67 .
Object
, więc nie można jej użyć jakoByRef x As Integer
parametru).