문제

충분히 간단하게 들리지만 작동하지 않습니다. 이 예에서는 3 개의 필드 값을 4 위로 설정하려고합니다. 나는 이런 일을 할 수있다 ....

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

...하지만 그것은 일종의 말이 많습니다 (예, VB는 대부분의 경우 vb가 말이 많습니다). 이것을 단일 라인 호출로 줄이는 데 사용할 수있는 것을 갖고 싶습니다. 그래서이 확장 방법을 만들었습니다.

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

Param Array의 값은 반품에서 업데이트되지 않았습니다! 나는 모든 최종 값이 이제 함수에있는 것처럼 "1"이 될 것으로 기대했다.

이와 같은 업데이트 가능한 Paramarray 컬렉션을 얻는 방법이 있습니까? Paramarray는 ByVal로 선언해야하지만 문자열과 같은 참조 유형을 사용하면 포인터의 사본 만 만들어 기본 값을 변경할 수 없습니까?

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

도움이 되었습니까?

해결책

당신이하려는 것은 Paramarray로 달성 할 수 없습니다. ParamArray 메소드를 호출 할 때 다음은 후드 아래에서 발생합니다.

  1. CLR은 적절한 길이의 배열을 할당합니다
  2. 그런 다음 값을 배열로 복사합니다
  3. 배열이 함수로 전달됩니다

값을 배열에서 그리고 전달 된 원래 변수로 복사하는 포스트 콜 작동은 없습니다.

함수가 값을 수정하고 호출 사이트에서 볼 수있는 유일한 안정적인 방법은 값을 ByRef를 전달하는 것입니다. Byrefs를 취하고 배열로 수동으로 변환 한 다음 복사를 다시 수행하는 오버로드 세트를 갖기 위해 약간의 마술을 할 수 있습니다. 그러나 그것은 당신이 얻을 가장 가까운 것입니다.

다른 팁

사례 (거의 10 년 전)에 대해 조금 늦었을 수도 있지만, 다른 사람이 작동하면 다른 사람을 도울 수 있습니다 ...

매개 변수 배열을 참조로 전달할 수는 없지만 배열을 참조로 전달할 수 있습니다.

변경하십시오 BYREF 그리고 제거하다 Paramarray

그런 다음이 라인을 수정하십시오.

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

ParamArray 대신 배열로 문자열을 전달하기 위해 추가 "{"및 "}"를 기록하십시오.

나는 클래스에서 이것을 일련의 컨트롤을 전달하기 위해 이것을 사용했고 (Paramarray가하지 않은 곳) 작동했기 때문에 (여기서 테스트 할 수 없음) 촬영할 가치가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top