[英]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.