繁体   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