2011-11-17 56 views
0

对于狂热的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"); 
} 

基本上我想保持“base_string”的参考在A_Class,因此螺纹的方法可以改变值,并且f1()中,我可以看到改变的值,在这种情况下“FDSA”。

谢谢!

+0

如果我得到你想要的东西,你想存储到'base_string'的引用,以便在'threadedFunction改变它() '在'f1()'中改变它? –

+0

是的,这是我想要的,但不仅仅是为了字符串,我还想节省一节课。 (字符串只是一个简单的例子) – Tizz

+0

然后看看我的答案。您需要编写一个小包装类来环绕要跟踪的对象。 –

回答

2

为此目的使用StringBuilder

表示可变字符串。

+0

如果我正在尝试这样做的对象不是字符串,而是类。那么该怎么办? – Tizz

1

它看起来像你想存储对引用的引用(如指针指针)。做这样的事情的一种方法是通过那台串入你的类像这样的方法:

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

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

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; 
    } 
} 
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); 
     } 
    } 
} 
相关问题