2010-06-14 13 views
21

Jak rozumiem, C# przekazuje parametry do metod przez odniesienie. W VB.NET można to określić za pomocą ByVal i ByRef. Wartością domyślną jest ByVal.Jak "zrobić" ByVal w C#

Czy jest to zgodne z programem Visual Basic 6.0, czy jest to po prostu losowe? Ponadto, jak mogę określić, co używać w C#? W pewnym sensie podoba mi się pomysł przekazywania parametrów według wartości.

+3

Zobacz szczegóły na temat wartości domyślnych na stronie http://pobox.com/~skeet/csharp/parameters.html. –

+3

Dobra odpowiedź, Jon, ale jesteś także sztuczną inteligencją! –

+4

W wersji vb6 parametry zostały przekazane jako 'ByRef' przy braku słowa kluczowego' ByVal'. W językach .net wartością domyślną jest wartość. Aby ułatwić migrację i uniknąć nieporozumień, vb.net wymaga, aby parametry były wyraźnie oznaczone jako "ByRef" lub "ByVal", ale edytor VS będzie "automatycznie korygował" parametry bez takiego oznaczania, dodając "ByVal". Ponieważ nigdy nie było żadnego języka C#, który miałby domyślne działanie pass-by-ref, nie ma problemu, mówiąc po prostu, że nieoznaczone parametry są wartościami typu pass-by-value. – supercat

Odpowiedz

50

Parametry w języku C# są przez domyślne przekazane przez wartość. Nie ma modyfikatora, który by to wyraźnie określał, ale jeśli dodasz ref/, parametr ten jest odsyłaczem.

Zazwyczaj zamieszanie tutaj jest różnica pomiędzy:

  • przekazując wartość typu ujęciu wartościowym (zmiany do typu wartości nie są widoczne dla osoby dzwoniącej, ale wartość typy powinny być idealnie niezmienny w każdym razie)
  • przekazywanie wartości przez referencję (zmiany typu wartości są widoczne dla osoby dzwoniącej, ale typy wartości powinny być w każdym razie niezmienne - tak ważne, że powiem to dwa razy; p)
  • przekazanie referencji według wartości (zmiany na pola/właściwości typu ref są widoczne dla c Aller, ale realokacja REF typu w/nowego przedmiotu jest nie widoczny)
  • przechodzącą odniesienia przez odniesienie (zmiany pól/właściwościami i przywróceniu odniesienia są widoczne wywołującego)
+0

Dzięki, właśnie to spowodowało moje zamieszanie. –

+0

Kiedy zaczynałem użyłem "ref" wszędzie, ponieważ myślałem, że to był odpowiednik C# przekazywania wskaźnika; < – Jake

7

Parametry w języku C# są domyślnie przekazywane "ByVal". Musisz podać "ref" lub "out", jeśli chcesz innego zachowania.

12

Przekazywanie według wartości jest domyślne w języku C#. Jeśli jednak przekazywana zmienna jest typu referencyjnego, podajemy wartość odniesienia. Być może jest to źródłem twojego zamieszania.

Zasadniczo, jeśli przekazujesz referencję według wartości, możesz zmienić obiekt, do którego się odnosi, a zmiany te pozostaną poza metodą, ale nie możesz uczynić zmiennej odwoływać się do innego obiektu i ta zmiana będzie istnieć poza metoda.

+0

Marc Gravell zredagował w zasadzie tę samą informację w swojej odpowiedzi podczas pisania tego, sprawiając, że ta odpowiedź jest zbędna. . –

+2

Twoja odpowiedź wciąż ma pewną wartość, ponieważ bezpośrednio odnosi się do rozróżnienia między modyfikowaniem odniesienia i modyfikowaniem instancji. Poza tym, najlepiej nie porównywać się do "ludzi" z rankingiem 50 + k: Mam do czynienia z dobrym autorytetem, że Reed to sztuczna inteligencja prowadzona przez Google, a większość innych jest również nie-ludzka. :-) –

+0

@Steven: Dobra uwaga :-) –