当前位置:  开发笔记 > 编程语言 > 正文

有没有办法将ParamArray值作为byRef处理,以便可以更新?

如何解决《有没有办法将ParamArray值作为byRef处理,以便可以更新?》经验,为你挑选了1个好方法。

听起来很简单,但它不起作用.在这个例子中,我想将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

     _
    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#不是一个选项).



1> JaredPar..:

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

    CLR分配一个适当长度的数组

    然后将值复制到数组中

    数组传递给函数

没有调用后操作会将值复制回数组并传递到传入的原始变量中.

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有