簡體   English   中英

我如何“鏈接”到另一個類中的屬性

[英]how do i “link” to a property in another class

我有一個包含字符串屬性的類(例如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

字符串是不可變的。 這意味着,當您“更改”一個字符串時,您實際上是在丟棄舊的字符串並創建一個全新的字符串。 如果不使用一些狡猾的不安全代碼,就無法解決這個問題。 (在這種情況下,“丟棄”是..忘記了。.以便稍后由垃圾收集器將其清除)。

在您的代碼上下文中,這意味着:

Name = "xyz";

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

如@SimonWhitehead所提到的,字符串是不可變的。 在這種情況下,您可以做的是更改您的changeIt方法以使用out參數,然后將myString作為輸入傳遞,如下所示:

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

調用此方法后,將為您提供輸出“ xyz”:

myClass.changeIt(out myString);

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

因此,在具有“重要”屬性的類中,更改其值時應觸發一個事件。

其他類應加入該事件並加以捕獲。

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

您可以在此鏈接上查看事件在C#中的工作方式。

如何執行此操作的示例如下:

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

基本上,您有一個可在事件的屬性之一每次更改時觸發事件的類。 然后,另一個屬於該事件的類,每次觸發該類時,它都會執行自己的某些過程。

您將字符串引用到構造函數中,並在其他方法中更改其值。 因此, ref關鍵字僅在代碼塊(在這種情況下為構造函數)內部起作用。

此代碼會將值myName更改為Name。 但是在構造函數被調用之后,myName將不再引用Name。 請注意,您是將Name分配給ref myName,它不會引用Name。

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

它實際上會做您想要實現的目標。 結果

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

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

在調用部分

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM