0

如何在类内的方法中更改 Reference 传递的参数的值?

IE:

Public Class Setting

    Public Sub New(Optional ByRef target as String = Nothing)
        _target = target
    End Sub

    Private Sub Go()
        If Not IsNothing(_target) Then
            _target = "New Value"
        End If
    End Sub

End Class

用法:

Dim var1 as String = "Old Value"
Dim s as New Setting(var1)
s.Go()

在 s.Go() 之后,我期望得到:

var1 = "New Value"

但我得到:

var1 = "Old Value"

谢谢

4

3 回答 3

1

使用包装类

例如,我使用 StringBuilder 作为包装类。

Public Class Setting
    Dim _target As StringBuilder
Public Sub New(Optional ByRef target as StringBuilder = Nothing)
    _target = target
End Sub

Private Sub ChangeValue()
    If Not IsNothing(_target) Then
        _target.Clear()
        _target.Append("New Value")
    End If
End Sub

Public Sub Go()
    ChangeValue()
End Sub

End Class
Sub Main()
    Dim var1 as New StringBuilder("Old Value")
    Dim s as New Setting(var1)
    s.Go()
    Console.WriteLine(var1)
End Sub
于 2013-11-07T18:46:19.913 回答
0

正如 Mike C 在评论中所说,很确定它必须使字符串不可变

字符串(C# 编程指南)

字符串对象是不可变的:它们在创建后无法更改。所有看似修改字符串的 String 方法和 C# 运算符实际上都在一个新的字符串对象中返回结果。

使用 Integer 进行测试不是苹果对苹果,因为 Integer 是一种值类型

我怀疑 = 做了一个深拷贝
这是 C#
即使这不会将 _s 附加到 s

public class Sclass
{
    public Sclass(ref string s)
    {
        s += "Sclass";
        string _s = s;
        _s += "_s";
    }
}
于 2013-11-07T19:24:41.497 回答
0

这个怎么样 ...

Public Sub New(Optional ByRef target as String = "")
    _target = target
End Sub

Private Sub ChangeValue()
    If _target.Length = 0 Then
        _target = "New Value"
    End If
End Sub
于 2013-11-07T17:55:23.197 回答