2011-08-08 16 views
7

Mam projekt w języku C#, który korzysta z innego projektu napisanego w vb.net. Obecnie jestem w stanie zmodyfikować oba.Parametry C# i VB.Net out

Mam metodę w projekcie VB jak:

Public Sub MethodName(ByVal param1 As String, ByRef param2 As String) 
     param2 = param1 + 1 
    End Sub 

nie jestem w stanie wywołać tę metodę za pomocą słowa kluczowego wyjście z C#:

public void CallOtherMethod() 
    { 
     string param1 ="test"; 
     string param2; 

     provider.AddTransaction(param1, out param2); 
    } 

nie powinien ByRef słowo kluczowe w VB.Net ma możliwości zarówno "ref" i "out"?

Czy powinienem po prostu iść z ref?

+2

Domyślam się, że 'out' jest tym samym co' ref' z dodatkowym atrybutem, podczas gdy 'ByRef' jest po prostu' ref'. – Joey

+0

Parametr ref wymaga inicjalizacji, ale nie potrzebuję tego ani go nie używam. Naprawdę nie pytam o to, ponieważ utknąłem, mogę z łatwością użyć ref. –

+3

możliwy duplikat [Czy istnieje odpowiednik VB.NET parametrów C# out] (http://stackoverflow.com/questions/4358742/is-there-a-vb-net-equivalent-of-c-out-parameters) –

Odpowiedz

14

Do runtime ref i out są dość wymienne, ponieważ oba są po prostu odniesienia. jednak, out jest poprzedzona dodatkowym atrybutem w IL:

public void y(ref int a) 
public void z(out int a) 

zamienia się

.method public hidebysig instance void y(int32& a) 
.method public hidebysig instance void z([out] int32& a) 

które umożliwia kompilatora C#, aby odróżnić dwa i dodać specjalne semantykę że out ma , a mianowicie, że parametr out nie musi mieć przypisanej wartości przed wprowadzeniem metody i musi być przypisana wartość przed zakończeniem t on metoda.

W przeciwieństwie do tego, ByRef w VB zapewnia tylko ref, ale nie jest dodatkową semantyką out. Nie istnieje odpowiednik out w VB.

2

Nie ma odpowiednika out w VB (według mojej wiedzy.) Po prostu ByRef, który jest odpowiednikiem ref, więc byłby to właściwy wybór.

Ponieważ będziesz przekazując przez odniesienie wywoływanej funkcji otrzymasz swoją wartość i będziesz musiał wprowadzić twój parametr tak, aby miał adres w pamięci.

EDIT:

Ponieważ można edytować zarówno, dlaczego nie zmienić Sub do Function i pozbyć problemu całkowicie, a IMO, uczynić swój kod ładniejszy też.

+0

Mam więcej niż jeden parametr, który musi powrócić w moim rzeczywistym projekcie. Zadałem to pytanie tylko ze względu na uczenie się, a nie rozwiązanie dla mojego projektu. Po prostu pójdę z ref. Twoje zdrowie. –

+3

Możesz zwrócić klasę lub strukturę. Tylko pomysł. – Jodrell