C # 출력 매개 변수에 해당하는 VB.NET이 있습니까?


95

VB.NET에는 out함수에 전달 된 변수를 초기화 할 필요가없는 C # 함수 매개 변수 와 직접적으로 동일 합니까?

답변:


98

아니요, outVB 에는 해당 키워드 가 없습니다 .

그러나 VB는 메서드의 모든 지역 변수를 자동으로 초기화하므로 ByRef먼저 변수를 명시 적으로 초기화 할 필요없이 사용할 수 있습니다 .

예:

Sub Main()
  Dim y As Integer
  Test(y)
End Sub

Sub Test(ByRef x As Integer)
  x = 42
End Sub

(프레임 워크의 코드 (예 : Double.TryParse ) 를 검사하는 경우 <OutAttribute>추가 된 매개 변수를 볼 수 있지만 COM interop 또는 플랫폼 호출에 대해 호출이 마샬링 될 때만 차이가 있습니다.)


2
@Spolto : VBScript를 VB로 번역하는 경우 명시 적 및 엄격 모드를 설정해야합니다. 더 많은 오류 메시지가 표시되지만 대부분은 2 차 문제 (예 : 유형없이 선언 된 변수가 Object이므로 ByRef x As Integer매개 변수에 사용할 수 없음 )보다는 문제의 원인 (예 : 유형없이 선언 된 변수)을 가리 킵니다 .
Guffa 2010

4
@Guffa : 버전 문제인지 모르겠지만 초기화되지 않은 참조 유형 변수를 ByRef매개 변수로 전달할 때 컴파일러 경고가 표시됩니다 . (값 유형 매개 변수에서는 발생하지 않습니다.)
Dan Tao

4
@Dan Tao, Spolto : 그 차이 인 것 같습니다. 참조 유형도 경고를받습니다. 매개 변수를 지정할 수 없다는 것은 언어의 한계이며, 경고를 없애기 위해 변수를 초기화하면됩니다. Nothing그들에게 할당해도 결과가 변경되지는 않지만 경고가 제거됩니다.
Guffa 2010

1
@Guffa : 예, Nothing지금까지 그들에게 할당 했습니다. 대규모 레거시 웹 사이트에서 수백 번 수행해야하므로 시간이 많이 걸립니다. 조사해 주셔서 감사합니다.
cspolton 2010

3
@MarkHurd : Out속성이 C # 키워드 와 동일 하지 않다는 것을 이미 다루었 기 때문에 반대표는 부당 out합니다.
Guffa 2011

32

내에서 언급 한 바와 같이 아니, 거기에 비 초기화 변수가 경고없이 메서드에 전달 될 수 있도록 상응하는 구조 없지만, 질의 응답 지정 <Out()>속성 A의 ByRef매개 변수 정의를 VB가이를 무시하지만, 되는 C 번호로 처리 이 AS out파라미터.

그래서, 난을 참조 변수-초기화를 사전 것입니다 Nothing 지정 <Out()> ByRef의도를 (C #을 사용자가 이제까지 당신의 방법에 액세스하는 경우 문제가 해결됩니다) 의미 할 수 있습니다.

Nothing할당되지 않은 참조 변수 의 기본값 에 액세스하려는시기를 알고 있다고 생각 되면 프로젝트 수준 (프로젝트 속성> 컴파일) 에서 "경고 구성" "할당 전 변수 사용""없음"으로 설정할 수 있습니다. 이 설정을 변경하기 전에 구성을 "모든 구성"으로 설정하려는 경우) 또는 VS2015 (VB.NET 14)에서 #Disable Warning BC42030.


3
이것은 중요합니다. MembershipProvider의 VB 하위 클래스와 VB 하위 클래스의 C # 하위 클래스가 있습니다. C # 코드는 MembershipProvider 기본 클래스에서 out으로 지정된 매개 변수에 대해 VB 클래스의 특성을 적용 할 때까지 MembershipProvider의 추상 메서드가 이미 구현되었다는 사실을 인식하지 못했습니다.
Richard Collette 2014 년

@RichardCollette 아마도 연결된 질문에 대한 답변이 될 가치가 있습니다!
Mark Hurd 2014 년

9

C # 버전

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

Vb.net 버전

    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1 
  z = 5 
End Sub

여기에서 답을 찾았습니다.

최신 정보

주석에서 언급했듯이 아웃 슬롯에서 사용할 매개 변수를 초기화하는 것을 잊지 마십시오


일반적으로 ByRefout에 가장 가까운 것에 동의합니다 . 그러나 질문에서 묻는 것처럼 초기화되지 않은 변수를 전달하면 ByRef 는 여전히 경고를 표시합니다.
Richard

내 반대표는 꽤 오래전의 것입니다. 링크 한 웹 사이트는 매우 일반적입니다. 특정 문제, 차이점 및 기술을 나열하지 않습니다. 또한 귀하의 답변은 여전히 ​​질문에 대한 답변이 아닙니다.
마크 허드 (Mark Hurd)

1

VB.NET에서 배열을 다시 전달하는 "by ref"함수를 호출 한 문제가 발생했습니다.

컴파일러가 경고로 플래그를 지정했지만 괜찮 았습니다. 수정은 매우 간단하며 아마도 좋은 프로그래밍 관행 일 것입니다.

나는 변했다

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing

fnRetArray(m_arr_values)

변수 이름이 설명적인 경우 코딩 할 때도 도움이됩니다.

Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
    ...
End Sub

3
헝가리어 표기법은 .NET 프레임 워크 설계 지침에 위배됩니다.
Gqqnbig

0

VB.NET에서 참조 방법으로 전달을 사용할 수 있습니다.

초기화 없이는 변수를 사용할 수 없기 때문에 C #에서 Out 매개 변수 메커니즘이 필요합니다.

VB.NET은 자동으로 수행되므로 특수 키워드가 필요하지 않습니다.

ByRef를 사용하십시오.


3
이것은 질문에 대한 대답이 아니며 C #과 관련하여 잘못되었습니다.
cspolton

byref를 사용하면 초기화하지 않고 매개 변수 값을 변경할 수 있습니다. 그러나 C # out 매개 변수와는 달리 값으로 매개 변수를 초기화하고 함수에서 사용할 수 있지만 C #에서는 out 키워드를 사용하여이 매개 변수를 외부 매개 변수로만 사용하고 입력으로 사용하지 않도록합니다. 함수. 또한 함수 내에서이 매개 변수에 값을 변경하거나 설정하지 않으면 컴파일 오류가 발생하는 C #과 달리 컴파일러가이를 오류로 포착하지 않습니다.
pashute


-5

변수 앞에 키워드 ByRef 를 사용하십시오 .


4
ByRefref함수에 전달하기 전에 초기화해야하는 C #의 매개 변수 와 동일 합니다.
cspolton 2010
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.