2013-11-07 4 views
0

Как изменить значение параметра, переданного ссылкой в ​​методе внутри класса?изменить значение параметра, переданного по ссылке

т.е.

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" 

Благодаря

+0

Почему бы просто не изменить его на ByVal, если вы хотите его изменить или, еще лучше, использовать функцию? – Plutonix

+0

Это может быть несколько особый случай, потому что строки неизменяемы. Получаете ли вы такое же поведение, если вы изменили цель на Integer? – mclark1129

+1

Я не думаю, что вы можете заставить его работать с вашим текущим дизайном. Либо передайте параметр ByRef в методе Go, либо вообще не используйте ByRef и возвращайте новое значение. –

ответ

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 
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 
0

Довольно, что он должен сделать строку будучи непреложным, как указано Майком C в комментарии

Strings (C# Programming Guide)

объекты Строка неизменны: они не могут быть изменены после того, как они были созданы , Все методы String и операторы C#, которые появляются для изменения строки, фактически возвращают результаты в новый объект строки.

Тестирование с Integer не яблоки с яблоками, как целое является типом значения

Подозреваю = делает глубокую копию
Это C#
Даже это не добавляет _S к с

public class Sclass 
{ 
    public Sclass(ref string s) 
    { 
     s += "Sclass"; 
     string _s = s; 
     _s += "_s"; 
    } 
} 
Смежные вопросы