Czy VB.NET ma bezpośredni odpowiednik outparametrów funkcji C # , gdzie zmienna przekazana do funkcji nie wymaga inicjalizacji?
Odpowiedzi:
Nie, outw 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ć ByRefbez 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.)
ByRefparametrów. (Nie dzieje się tak z parametrami typu wartości.)
Nothingdo nich pozbędzie się ostrzeżenia, chociaż nie zmienia to wyniku.
Nothingdo 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.
Outatrybut nie jest równoważny ze outsł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 ByRefdefinicji parametru, chociaż VB go ignoruje, jest traktowany przez C # jako outparametr.
Tak więc wstępnie zainicjowałbym zmienne referencyjne Nothing i określiłem je, <Out()> ByRefaby 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 Nothingw 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 Integerparametru).