2011-11-17 98 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); 
     } 
    } 
} 
相關問題