2013-05-09 93 views
2

這是類測試C#對象參考:我該怎麼做?

public class Test 
{ 
    public string mystr; 
} 

我這樣稱呼它的方法:

string my = "ABC"; 
    Test test = new Test(); 
    test.mystr = my; 
    test.mystr = ""; 

上方的位碼結果是:my = "ABC"test.mystr = ""

如何設置my到空字符串""當我更改test.mystr = ""

+2

我想你需要一個包一個自定義類型的字符串,其中一個Value屬性包含實際的字符串值。然後爲您的自定義類型添加隱式類型轉換爲String。 (沒有時間寫代碼,所以有人可以作爲答案。) – cfeduke 2013-05-09 11:45:04

+0

看看這個 http://msdn.microsoft.com/en-us/library/s6938f28.aspx – Mrgn 2013-05-09 11:49:19

+0

此問題已關閉before我可以完成編輯我的答案,請參閱[Eric Lippert的這個答案](http://stackoverflow.com/a/2982037/703016),它解釋了爲什麼它不可能以及如何獲得類似的行爲。 – 2013-05-09 12:04:53

回答

7

如果我理解正確,你想變量mytest.myStr被鏈接,所以如果一個變化,其他變化?

答案很簡單:它不能!

一個字符串是一個不可變的類。多個引用可以指向一個字符串實例,但是一旦這個實例被修改,就會用新值創建一個字符串實例。所以一個新的引用被分配給一個變量,而其他變量仍然指向其他實例。

有一種變通方法,但我懷疑你會不會喜歡它:現在

public class Test 
{ 
    public string mystr; 
} 

Test myTest1 = new Test { myStr = "Hello" }; 
Test myTest2 = myTest1; 

,如果你改變myTest1.myStr,變量myTest2.myStr也將被修改,但是這僅僅是因爲myTest1myTest2是相同的實例。

還有像這樣的其他解決方案,但都歸結爲同一方面:一個類持有對字符串的引用。

+0

對,如果類型保持爲.NET Fx String中的內建類型,那麼您將無法像做C中的指針那樣做任何事情。 – cfeduke 2013-05-09 11:49:35

2

.NET中的字符串是不可改變的,不能像那樣工作。你可以嘗試的一種方法是爲字符串使用可變包裝。

public class StringReference 
{ 
    public string Value {get; set;} 

    public StringReference(string value) 
    { 
     Value = value; 
    } 
} 

public class Test 
{ 
    internal StringReference mystr; 
} 

StringReference my = new StringReference("ABC"); 
Test test = new Test(); 
test.mystr = my; 
test.mystr.Value = ""; 
// my.Value is now "" as well 
0
string my = "ABC"; 
Test test = new Test(); 

注意這裏,有你的Test類和串my之間沒有任何關係。我不完全知道你正在努力實現的是什麼,但我們可以做到這一點是這樣的:

public class Test 
{ 
    private string _mystr; 
    private Action<string> _action; 

    public Test(Action<string> action) 
    { 
     _action = action; 
    } 

    // Let's make mystr a property 
    public string mystr 
    { 
     get { return _mystr; } 
     set 
     { 
      _mystr = value; 
      _action(_mystr); 
     } 
    } 
} 

現在你可以這樣做:

string my = "ABC"; 
Test test = new Test((mystr) => { if(string.IsNullOrEmpty(mystr)) my = ""; }); 
test.mystr = my; 
test.mystr = "";