Как сохранить ссылку на объект в другом классе? - PullRequest
0 голосов
/ 17 ноября 2011

Это должно быть очень простым решением для заядлого разработчика на C #.Я ищу, чтобы изменить значение строки в классе, поэтому в потоке строка может измениться без моего участия.Вот небольшой пример того, что я имею в виду, упрощенно, но вы должны понять:и в f1 () я вижу измененное значение, в данном случае «fdsa».

Спасибо!

Ответы [ 4 ]

2 голосов
/ 17 ноября 2011

Используйте для этой цели StringBuilder .

Представляет изменяемую строку символов.

1 голос
/ 18 ноября 2011

Вам нужно будет использовать промежуточный класс-обёртку:

public class Wrapper<T> // generic, so can be used with any type
{
    public T Value { get; set; }
    public Wrapper(T val) { Value = val; }
}

class A_CLass
{
    Wrapper<string> keptString;

    void keepString(string theString) 
    {
        keptString = new Wrapper<string>(theString);
    }

    void changeString(string theString) 
    {
        keptString.Value = theString;
    }
}
1 голос
/ 17 ноября 2011

Похоже, вы хотите сохранить ссылку на ссылку (как указатель на указатель).Один из способов сделать что-то подобное - это передать метод, который устанавливает строку в ваш класс, например так:

class A_Class
{
    Action<string> setter;
    void storeSetter( Action<string> setter ) 
    {
        this.setter = setter;
    }
    void callSetter( string str ) 
    {
        setter(str);
    }
}

Затем передать лямбду, которая задает строку как:

public class OtherClass
{
    private string someString;
    private void test()
    {
        var a = new A_Class();
        a.keepString((s)=>{someString = s;});
    }
}

Когда у вашего класса есть этот метод установки строки, вы можете вызвать метод для установки строки.

0 голосов
/ 06 июня 2013
class A_Class
{
    Ref<string> link;
    void  A_Class( Ref<string> link) 
    {
        this.link= link;
    }
    void somefunction( string str ) 
    {
        if(link.Value.Length > 2)
            link.Value = str;
    }
}


public class Ref<T> 
{
    private Func<T> getter;
    private Action<T> setter;
    public Ref(Func<T> getter, Action<T> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public T Value
    {
        get
        {
            return getter();
        }
        set
        {
            setter(value);
        }
    }
}
...