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