簡體   English   中英

我如何使用訪問器?

[英]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);
        }

單擊按鈕時,它顯示空白文本。 根據我的理解,這些是它采取的步驟:

  1. 帶有“cake”值的變量更改傳遞給classy的changeLine方法。
  2. changeLine方法將Form1行設置為變量,並使用“cake”值。
  3. MessageBox顯示“cake”值的行變量。

為什么這不起作用?

這是因為您在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;

設置這個新的不同 Form1Line屬性(以及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上。 但您仍然可以通過至少兩種方式獲得所需的行為:

  1. 您可以在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; } } 
  2. 你可以改變你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.

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