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

本文关键字:对象 引用 保存 另一个 | 更新日期: 2023-09-27 18:14:48

对于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"。

谢谢!

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

使用StringBuilder实现此目的。

表示一个可变字符串。

看起来您想要存储对引用的引用(就像指针对指针)。这样做的一种方法是传递一个方法,该方法将字符串设置为类,如下所示:

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

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

您必须使用一个中间包装器类:

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