2012-02-09 9 views
28

Właśnie zainstalowałem pakiet serwisowy Visual Studio 2010 (proponowany w witrynie Windows Update) i widzę nową funkcję w "intellisense", co oznacza, że ​​gdy piszę w VB.NET Function lub Sub, nie jest ona automatycznie uzupełniana przez parametry z ByRef lub ByVal ...Dlaczego nie trzeba już oznaczać ByVal/ByRef?

1) Czy mimo to mogę skonfigurować tę opcję z powrotem do tego, jak było wcześniej?

2) Jeśli nie podam ByX, która z nich jest używana domyślnie? (Wydaje się, że jest to zawsze ByRef)

+2

Domyślną wartością jest 'ByVal', ale należy zrozumieć, co [przechodzącej przez wartość i przez odniesienie] (http://msdn.microsoft.com/en-us/library/ddck1z30.aspx) w rzeczywistości oznacza. –

+9

Prawie zawsze chcesz przekazać 'ByVal', a to w rzeczywistości jest domyślne. Nie ma powodu, aby kod był zagracony z 'ByVal' w każdym miejscu; to tylko "hałas". Wyraźnie określ tylko 'ByRef', kiedy absolutnie musisz mieć semantykę typu" przekaż jako odniesienie ". –

Odpowiedz

17

Tim pokryty co pytasz bezpośrednio, ale coś innego, aby pamiętać, że każdy typ zmiennej referencyjnej, jak klasy zdefiniowane przez użytkownika, nawet jeśli przekazane przez wartość pozwoli Ci wprowadzić zmiany do tych właściwości instancji itp., które pozostają. Nie pozwoli ci jednak na zmianę całego obiektu. Które mogą być, dlaczego wydawało wam się nie stawili się przez odniesienie

Public Sub (Something As WhateverClass) 
    Something = New WhateverClass 'will result in no changes when outside this method 

    Something.Property1 = "Test" 'will result in an updated property when outside this method 
End Sub 

Od MSDN:

Wartość typu odniesienia jest wskaźnik do danych w innych miejscach pamięci. Oznacza to, że po przekazaniu typu odniesienia według wartości, kod procedury ma wskaźnik do danych elementu bazowego, , nawet jeśli nie może uzyskać dostępu do samego elementu podstawowego. Dla przykładu, jeśli element jest zmienną tablicową, kod procedury nie ma dostępu do samej zmiennej, ale może uzyskać dostęp do elementów składowych tablicy .

+0

Ta odpowiedź jest wprowadzająca w błąd, ponieważ wyjaśnia "w jaki sposób działa wartość typu odniesienia", podczas gdy pytanie brzmi: "dlaczego nie jest już konieczne oznaczanie ByVal/ByRef?" – mchar

31

Wydaje się, że ten post dotyczy zapytanie:

http://msmvps.com/blogs/carlosq/archive/2011/03/15/vs-2010-sp1-changing-quot-byval-quot-vb-net-code-editor-experience.aspx

Więc nie, nie ma sposobu, aby pozbyć się starego zachowania. Odtąd domyślnie jest to ByVal i nie zostanie automatycznie dodane do parametrów metody.

Moim zdaniem jest to dobra decyzja, ponieważ czyni VB.NET bardziej spójną z C# i unika niepotrzebnych "odgłosów" (jest już wystarczająco gadatliwa).

Old zachowanie:

Private Sub test(ByVal test As String) 
End Sub 

Nowe zachowanie

Private Sub test(test As String) 
End Sub 
+0

Zwięzła i prosta odpowiedź na pytanie, dobrze zrobione! – mchar

8

Uważaj podczas przenoszenia do procedur VBA, gdzie domyślnym jest ByRef (patrz, na przykład, „Domyślna metoda przekazywania parametrów” na the bottom of this page, przez wielkiego Chip Pearson). To może być brudne.

Powiązane problemy