听起来很简单,但它不起作用.在这个例子中,我想将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#不是一个选项).
ParamArray无法实现您想要做的事情.当您调用ParamArray方法时,会发生以下情况
CLR分配一个适当长度的数组
然后将值复制到数组中
数组传递给函数
没有调用后操作会将值复制回数组并传递到传入的原始变量中.
使函数修改值并让它在调用站点看到的唯一可靠方法是传递值ByRef.你可以做一些魔术来获得一组过载,这些过载采用ByRefs,手动转换为数组,然后进行复制.但那是你最接近的.