gpt4 book ai didi

vb.net - 有什么方法可以将ParamArray值作为byRef处理,以便可以对其进行更新?

转载 作者:行者123 更新时间:2023-12-03 16:18:59 39 4
gpt4 key购买 nike

听起来很简单,但无法正常工作。在此示例中,我想将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在大多数情况下都是罗y的)。我希望有一些东西可以减少到单线调用,所以我做了这个扩展方法。
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#并非为此的选择)。

最佳答案

您要执行的操作无法使用ParamArray实现。当您调用ParamArray方法时,将在后台发生以下情况

  • CLR分配适当长度的数组
  • 然后将值复制到
  • 数组中
  • 数组向下传递到函数


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

    使函数修改值并在调用站点上看到它的唯一可靠方法是传递值ByRef。您可以做一些魔术,以获取一组使用ByRefs的重载,手动将其转换为数组,然后再进行复制。但这是您将获得的最接近的东西。

    关于vb.net - 有什么方法可以将ParamArray值作为byRef处理,以便可以对其进行更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/650233/

    39 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com