2014-05-14 42 views
0

我有一個類(比如classA),它包含一個字符串屬性。我如何「鏈接」到另一個類別的房產

我想從另一個類(比如classB),所以,當我的財產轉爲classA它改變classB反之亦然設置爲一個字符串屬性。

我知道我可以通過使用ref與功能做到這一點,但是當我嘗試在我的課(構造函數),這是行不通的

這裏是我;

public class myClass 
{ 
    public string Name; 
    public int Image; 
    public myClass(ref string myName) 
    { 
     Name = myName; 
    } 

    public void changeIt() 
    { 
     Name = "xyz"; 
    } 

} 

而我的主要代碼;

string myString = "abc"; 
Console.WriteLine("myString:"+myString); 
myClass mClass = new myClass(ref myString); 
mClass.changeIt(); 
Console.WriteLine("myString (After doThis):" + myString); 
Console.ReadLine(); 

當我運行它產生;

myString:abc 
myString (After doThis):abc 

有什麼我在這裏失蹤?爲什麼不更改爲xyz

回答

2

一般來說,一個對象狀態的變化應該與一個事件通信。

因此,在具有「重要」屬性的類中,當您更改其值時,應該觸發一個事件。

其他類應該被引用到這個事件中並捕獲它。

您可以將更改後的字符串的值添加到觸發事件,以便在字符串值更改時甚至不需要引用該對象。

您可以看到事件如何在C#上使用this link

怎麼做它可以作爲一個榜樣:

class ClassWithImportantProperty 
{ 
    string myString = string.Empty; 

    public string MyImportantProperty 
    { 
     get { return myString; } 
     set 
     { 
      myString = value; 
      if (PropertyChanged != null) 
       PropertyChanged(myString, EventArgs.Empty); 
     } 
    } 

    public event EventHandler PropertyChanged; 
} 

class SecondClass 
{ 
    public string MyDependantString { get; set; } 

    public secondClass() 
    { 
     var classInstance = new ClassWithImportantProperty(); 
     classInstance.PropertyChanged += classInstance_PropertyChanged; 
    } 

    void classInstance_PropertyChanged(object sender, EventArgs e) 
    { 
     MyDependantString = sender.ToString(); 
    } 
} 

基本上你,每一次它的一個特性改變觸發一個事件類。 然後另一個訂閱了這個事件的類,每次被觸發時,它都會執行一些它自己的過程。

4

字符串是不可變的。這意味着,當你「改變」一個字符串時,你實際上扔掉了舊字符串並創建了一個全新的字符串。沒有避免使用一些不安全的代碼。 (在這種情況下,「扔掉」是......忘記它,讓垃圾收集器稍後清理它)。

這意味着在你的代碼的背景是什麼,是這樣的:

Name = "xyz"; 

創建與內容xyz一個新字符串引用並將其分配給參考Name。調用者中的myString不受該影響..它是一個不同的參考。

+0

爲什麼它在類中做,而不是在函數中? – blink

+0

因爲參考在班級範圍內是相同的。字符串不是這種情況。 –

+0

我的意思是; home come我可以傳遞一個函數,如果函數改變了這個值,它將在函數外面被改變。還是我錯過了點? – blink

2

正如@SimonWhitehead所說,字符串是不可變的。什麼,你可以在這種情況下做的,是要改變你的changeIt方法採取out參數,然後在myString傳遞作爲輸入,像這樣:

public void changeIt(out string myName) 
{ 
    myName = "xyz"; 
} 

這會給你的輸出「​​XYZ」之後你打電話給這個方法爲:

myClass.changeIt(out myString); 
+0

好的謝謝。我想最後我想要的是不可能的。我想要一個管理輸入的類,所以當我改變它的值時,它會自動改變它的原始類。這意味着我不必擔心總是獲取和設置數值。這個功能可能還有另一個解決方案嗎? – blink

+0

不錯的選擇! +1 –

+1

@ user3413042您可以使用事件,它涉及多一點的代碼,但會自動執行整個過程:)(作爲答案添加它也帶有示例)。 –

0

要更改string,請在代碼中進行以下更改。

public string changeIt() 
{ 
    return "xyz"; //return a string from method 
} 

在調用部分

myString=mClass.changeIt(); //assign return value to myString 
1

你引用一個字符串到構造函數和其他方法改變其值。因此,ref關鍵字只能在一段代碼中使用,在這種情況下,它是構造函數。

此代碼會將值myName更改爲名稱。但是在調用構造函數之後,myName將不再引用一個名稱。請注意,您正在將名稱分配給ref myName,並且它不會引用名稱。

public myClass(ref string myName) 
{ 
    myName = Name; 
} 

這將改變字符串,以及:

public void changeIt(ref string myName) 
{ 
    Name = "xyz"; 
    myName = Name; 
} 

我不會寫,因爲一成不變的其他球員已經回答了。你可以用接口這樣做:

class Program 
{ 
    public interface IName 
    { 
     string Name { get; } 
    } 
    public class myClass : IName 
    { 
     public string Name { get; set; } 
     public myClass(string myName) 
     { 
      Name = myName; 
     } 
     public void changeIt() 
     { 
      Name = "xyz"; 
     } 
    } 
    public class myClass2 : IName 
    { 
     private IName iname; 
     public string Name { get { return iname.Name; } } 
     public myClass2(IName myName) 
     { 
      iname = myName; 
     } 
    } 
    static void Main(string[] args) 
    { 
     myClass mClass = new myClass("abc"); 
     myClass2 m2Class = new myClass2(mClass); 

     Console.WriteLine("myString:" + m2Class.Name); 

     mClass.changeIt(); 

     Console.WriteLine("myString (After doThis):" + m2Class.Name); 
     Console.ReadLine(); 
    } 
} 

它會實際上做你想達到的。 result

相關問題