如何保存对另一个类中对象的引用?

时间:2011-11-17 00:49:15

标签: c# pass-by-reference

对于狂热的C#开发人员来说,这应该是一个非常简单的解决方案。我希望改变一个类中的字符串的值,所以在一个线程中,字符串可以在我不做任何事情的情况下改变。这是我的意思,简化的一个小例子,但你应该明白这一点。

class A_CLass
{
    string keptString;

    void keepString( ref string theString ) 
    {
        keptString = theString;
    }

    // This will get called when the thread is triggered
    void changeString( string theString ) 
    {
        keptString = theString;
    }
}

void f1()
{
    A_Class a = new A_Class();
    string base_string = "asdf";

    a.keepString( ref base_string );
    ...
    // Thread is signaled
    ...
    // Now base_string should be "fdsa"
}

void threadedFunction()
{
    // When the thread is triggered ...
    a.changeString( "fdsa" );
}

基本上我想在A_Class中保留'base_string'的引用,因此线程方法可以更改值,在f1()中,我可以看到更改的值,在本例中为“fdsa”。

谢谢!

4 个答案:

答案 0 :(得分:2)

为此目的使用StringBuilder

  

表示可变字符串。

答案 1 :(得分:1)

看起来你想要存储对引用的引用(比如指向指针的指针)。做这样的事情的一种方法是传递一个方法,将字符串设置为你的类:

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

然后传入一个设置字符串的lambda:

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

一旦你的类有这个字符串设置方法,你可以调用该方法来设置字符串。

答案 2 :(得分:1)

您必须使用中间包装类:

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;
    }
}

答案 3 :(得分:0)

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);
        }
    }
}