2009-03-16 10 views
4

소리는 간단하지만 작동하지 않습니다. 이 예제에서는 3 필드의 값을 4로 설정하려고합니다. 나는 ....byRef와 같이 ParamArray 값을 처리 할 수있는 방법이 있습니까?

Dim str1 As String = "1" 
Dim str2 As String = "2" 
Dim str3 As String = "3" 
Dim str4 As String = "4" 

str2 = str1 
str3 = str1 
str4 = str1 

을 같은 것을 할 수 ...하지만 (그래, 나도 알아, 비주얼 베이직 대부분의 경우 말의이다) 가지 말의입니다. 한 줄로 줄이기 위해 사용할 수있는 무언가를 갖고 싶습니다. 그래서이 확장 메서드를 만들었습니다.

Module Module1 

    Sub Main() 

     Dim str1 As String = "1" 
     Dim str2 As String = "2" 
     Dim str3 As String = "3" 
     Dim str4 As String = "4" 

     Console.WriteLine("Extension method return value = {0}", str1.SetEqual(str2, str3, str4)) 
     Console.WriteLine("String 1 = {0}", str1) 
     Console.WriteLine("String 2 = {0}", str2) 
     Console.WriteLine("String 3 = {0}", str3) 
     Console.WriteLine("String 4 = {0}", str4) 

     Console.ReadKey() 

    End Sub 

    <System.Runtime.CompilerServices.Extension()> _ 
    Public Function SetEqual(Of T)(ByVal source As T, _ 
            ByVal ParamArray targets() As T) _ 
            As T 

     For _index = 0 To targets.Length - 1 
      targets(_index) = source 
      Console.WriteLine("Target Value {0} = {1}", _index, targets(_index)) 
     Next 

     Return source 

    End Function 

End Module 

직설적 인 것으로 보입니다. 맞습니까? 출력은 다음과 같습니다.

Target Value 0 = 1 
Target Value 1 = 1 
Target Value 2 = 1 
Extension method return value = 1 
String 1 = 1 
String 2 = 2 
String 3 = 3 
String 4 = 4 

반환 값으로 매개 변수 값이 업데이트되지 않았습니다! 함수에있는 것처럼 마지막 값이 모두 "1"이 될 것으로 예상했습니다.

이렇게 업데이트 할 수있는 ParamArray 컬렉션을 얻을 수있는 방법이 있습니까? ParamArray는 ByVal로 선언해야하지만 String과 같은 참조 유형을 사용하면 포인터의 사본 만 만들고 기본 값을 변경할 수 없습니까?

내가 원하는 것을 얻는 더 좋은 방법이 있습니까? (C#은이 옵션이 아닙니다.)

답변

5

ParamArray를 사용하여 수행하려는 작업을 수행 할 수 없습니다. 다음은 후드 발생 ParamArray 메소드를 호출 할 때

  1. CLR은 적당한 길이의 배열을 할당
  2. 값이어서
  3. 배열 함수
아래로 전달 된 배열에 복사

값을 배열 밖으로 그리고 전달 된 원래 변수로 복사 할 후 호출 작업이 없습니다.

신뢰할 수있는 유일한 방법 함수가 값을 수정하고 호출 사이트에서 ByRef 값을 전달하는 것으로 보입니다. ByRefs를 사용하는 오버로드 집합을 가지려면 수동으로 배열로 변환 한 다음 복사본을 다시 수행하는 마법을 약간 할 수 있습니다. 그러나 그것은 당신이 얻게 될 가장 가까운 것입니다.

+0

오, 조이. 그것이 내가 두려워했던 것입니다. 감사합니다 Jared. – StingyJack