代码之家  ›  专栏  ›  技术社区  ›  StingyJack

有没有办法像byref那样处理paramarray值,以便更新它们?

  •  4
  • StingyJack  · 技术社区  · 15 年前

    听起来很简单,但不起作用。在本例中,我想将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,但是对于字符串这样的引用类型,这难道不应该只复制指针并允许我更改基础值吗?

    有没有更好的方法来得到我想要的?(C不是一个选项)。

    2 回复  |  直到 6 年前
        1
  •  5
  •   JaredPar    15 年前

    使用ParamArray无法实现您正在尝试的操作。当调用ParamArray方法时,以下内容出现在引擎盖下

    1. clr分配适当长度的数组
    2. 然后将这些值复制到数组中
    3. 数组被传递到函数中

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

    让函数修改值并在调用站点上看到它的唯一可靠方法是传递值byref。您可以做一点魔术,让一组重载接受byrefs,手动转换为数组,然后进行复制。但这是你能得到的最接近的。

        2
  •  0
  •   torpid prey    6 年前

    可能会有点晚(大约10年前),但如果它起作用的话可能会帮助其他人…

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

    把它改成 传地址 去除 参数阵列

    然后修改此行:

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

    只需注意附加的“”和“”就可以将字符串作为数组而不是参数数组传递。

    我在一个类中使用它来传递一个控件数组,它起作用(而ParamArray没有作用),所以我希望(不能在这里测试它),但它可能值得一试。