5

十分に単純に聞こえますが、機能していません。この例では、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 は冗長です)。これを1行の呼び出しに減らすために使用できるものが欲しいので、この拡張メソッドを作成しました。

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 配列の値が戻り時に更新されませんでした! 関数のように、すべての最終値が「1」になることを期待していました。

このような更新可能な ParamArray コレクションを取得する方法はありますか? ParamArray は ByVal として宣言する必要がありますが、String のような参照型では、ポインターのコピーを作成するだけで、基になる値を変更できるのではないでしょうか?

私が欲しいものを手に入れるためのより良い方法はありますか?(C# はこのオプションではありません)。

4

2 に答える 2

6

あなたがやろうとしていることは、ParamArray では達成できません。ParamArray メソッドを呼び出すと、内部で次のことが発生します。

  1. CLR は適切な長さの配列を割り当てます
  2. 次に、値が配列にコピーされます
  3. 配列は関数に渡されます

値を配列からコピーして、渡された元の変数にコピーする呼び出し後の操作はありません。

関数に値を変更させ、呼び出しサイトでそれを表示させる唯一の確実な方法は、値 ByRef を渡すことです。ByRefs を受け取り、手動で配列に変換してからコピーバックする一連のオーバーロードを作成するために、少し魔法をかけることができます。しかし、それがあなたが得ようとしている最も近いものです。

于 2009-03-16T12:38:12.123 に答える