[英]How do I use accessors?
我是編程的完全業余愛好者,我正在努力學習正確的代碼設計。 我試圖學習如何使用訪問器,但似乎無法使其正常運行。 這就是我想要運行的:
class Classy
{
public void changeLine(string change)
{
Form1 form1 = new Form1();
form1.Line = change;
}
}
public partial class Form1 : Form
{
string line = "";
public string Line
{
get
{
return line;
}
set
{
line = value;
}
}
private void button2_Click(object sender, EventArgs e)
{
line = "";
string change = "cake";
Classy classy = new Classy();
classy.changeLine(change);
MessageBox.Show(line);
}
單擊按鈕時,它顯示空白文本。 根據我的理解,這些是它采取的步驟:
為什么這不起作用?
這是因為您在changeLine
方法上創建Form
的新實例。 此新實例與觸發事件或單擊按鈕的實例不同。
為了使用正確的Form
引用,您可以將實際引用作為參數傳遞:
public void changeLine(Form1 form, string line) {
form.Line = line;
}
您可以像這樣調用此方法(從表單中):
classy.changeLine(this, change);
this
是當前的Form1
實例,它是您要修改的實例。 您不想創建新的。
好的。 你有一個Form1
對象,它代表的窗口和控件顯示在屏幕上。 單擊一個按鈕,它會調用一個方法。
line = "";
此line
是一個私有字段,恰好是Line
屬性的支持字段。 此時訪問line
字段或Line
屬性將返回""
。
string change = "cake";
此方法的本地字符串。
Classy classy = new Classy();
好的,我們有一個Classy
類型的新對象叫做classy
。
classy.changeLine(change);
讓我們來看看這個電話的作用:
Form1 form1 = new Form1();
您現在有一個不同的 Form1
對象。 如果你調用form1.Show()
你現在屏幕上會有兩個窗口。
form1.Line = change;
設置這個新的不同 Form1
的Line
屬性(以及line
字段)。
我們現在返回調用方法:
MessageBox.Show(line);
顯示原始 Form1
對象的line
字段的值。
要演示從類外部設置的屬性,您可以執行以下操作:
class Classy
{
public void changeLine(Form1 form1, string change)
{
form1.Line = change;
}
}
public partial class Form1 : Form
{
string line = "";
public string Line
{
get
{
return line;
}
set
{
line = value;
}
}
private void button2_Click(object sender, EventArgs e)
{
string change = "cake";
Classy classy = new Classy();
classy.changeLine(this, change);
MessageBox.Show(line);
}
}
這里因為Form1
傳遞本身( this
是指運行方法的對象),以classy
自己的Line
屬性將現在被使用。
或者:
class LineStorer
{
private string _line;
public string Line
{
get { return _line; }
set { _line = value; }
}
}
public partial class Form1 : Form
{
private void button2_Click(object sender, EventArgs e)
{
var storer = new LineStorer();
storer.Line = "cake";
MessageBox.Show(storer.Line);
}
}
這里的表單首先設置然后在另一個對象中獲取屬性。
另請注意,對象可以使用自己的屬性而不是支持字段:
public partial class Form1 : Form
{
private string _line;
public string Line
{
get { return _line; }
set { _line = value; }
}
private void button2_Click(object sender, EventArgs e)
{
Line = "cake";
MessageBox.Show(Line);
}
}
從內部來看,可以說,無論是使用字段還是屬性都沒有多大區別,但使用屬性確實有一個優勢,即如果有一天你改變了這個更簡單的屬性(從一個字段讀取和寫入字段,對一個更復雜的問題(通常情況下包括對所有設置的驗證檢查,但你遠遠不限於此),那么你只需要改變定義屬性的一個地方而不是很多,使用它的地方。
(看起來使用Line
似乎比使用line
更多的工作,因為它確實調用了更多的代碼,因此使用屬性而不是字段將是一個輕微的低效率,隨着時間的推移會增加。幸運的是,抖動足夠聰明在代碼運行時“內聯”簡單的getter和setter,所以實際上沒有任何成本)。
你所做的就是你得到的。 您希望顯示line
的值,但在顯示之前不要將其設置為其他值。 無論你在這三行代碼中做什么,都與更改CLASS FORM1的特定實例中的line
的值無關。
string change = "cake";//You declare and initialize a variable
Classy classy = new Classy();//You create an instance of class Classy
classy.changeLine(change);//You invoke a method in that class that has no clue of what is going on this side
是的,它確實將line
的值設置為“cake”,但是在另一個OBJECT上。 但您仍然可以通過至少兩種方式獲得所需的行為:
您可以在Form1類型的Classy類中擁有一個實例變量,並且具有一個構造函數,該構造函數將接收Form1對象作為參數。 然后在你的changeLine
方法中,你可以改變特定實例變量的行,而不是創建一個全新的Form1對象,如下所示:
public class Classy{ private Form1 _form1; public Classy(Form1 form1){ _form1=form1; } public void changeLine(string change){ _form1.Line=change; } }
你可以改變你changeMethod
接受類型Form1的一個額外的參數,然后將它傳遞this
調用里面Form1的時候
public void changeLine(string change,Form1 form1){ form1.line=change; }
在Form1方面:
classy.changeLine("cake",this);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.