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 在大多数情况下都是罗嗦的)。我想有一些东西可以用来减少单行调用,所以我做了这个扩展方法。

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# 不是这个选项)。

4

2 回答 2

6

使用 ParamArray 无法实现您想要做的事情。当您调用 ParamArray 方法时,会在后台发生以下情况

  1. CLR 分配适当长度的数组
  2. 然后将值复制到数组中
  3. 数组向下传递给函数

没有调用后操作会将值从数组中复制回传入的原始变量中。

让函数修改值并在调用站点看到它的唯一可靠方法是传递值 ByRef。您可以做一些魔术来拥有一组采用 ByRefs 的重载,手动转换为数组,然后进行复制。但那是你将得到的最接近的。

于 2009-03-16T12:38:12.123 回答
0

举例来说可能有点晚了(大约 10 年前),但如果可行的话可能会帮助其他人......

您不能将参数数组作为引用传递,但可以将数组作为引用传递。

将其更改为ByRef删除 ParamArray

然后修改这一行:

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

只需注意额外的“{”和“}”以将字符串作为数组而不是 ParamArray 传递

我在一个类中使用它来传递一组控件并且它有效(ParamArray 没有)所以我希望(不能在这里测试它)但它可能值得一试

于 2018-08-21T00:07:13.020 回答