问题描述
我正在尝试构建一个程序,但我意识到我无法访问某个变量,因为它是用另一种方法创建的。
这是我正在尝试做的一个例子:
namespace Example
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender,EventArgs e)
{
string text = textBox1.Text;
}
private void label1_Click(object sender,EventArgs e)
{
// Get the "text" variable and use it
label1.Text = text;
}
}
}
解决方法
您的示例有一个名为 Form1
的 Form 有一个名为 button1
的 Button,一个名为 { {1}} 和一个名为 textbox1
的标签。
您尝试的场景是:
- 用户在
label1
中输入一些文本 - 用户点击
textbox1
,这将保存button1
中的当前值 - 用户点击
textbox1
,这将显示在上一步中存储的值
重要的是要了解,在这种情况下,我们不会尝试在 2 个方法之间传递值,因为按钮单击和标签单击可以彼此独立发生,所以实际上就像计算器上的内存存储 (M+) 和内存调用 (MR) 按钮。
为了实现这个存储,您应该在 label1
类上创建一个实例变量(有时称为成员变量),这Form1
类的同一实例上的其他方法可以访问。
参见Working with Instance and Local variables以获得实用的解释
-
创建一个 field 或一个 property 来存储该值,对于您的具体示例,任何一种都可以,但是要熟悉使用 C# 技术,我建议您从属性开始,因为它更好地封装了存储值以供以后使用 和以后可能增加实际存储值的方式和位置的场景。
请参阅What is the difference between a field and a property? 进行健康的讨论
在您需要更改实现之前,您可以简单地使用 Auto-PropertyForm1
-
现在在
public string StoredText { get; set; }
的 click 事件处理程序中,我们可以设置button1
上的StoredText
属性的值}} 实例Form1
set 是我们用来在 c# 中将值保存到属性中的术语 注意
private void button1_Click(object sender,EventArgs e) { this.StoredText = textBox1.Text; }
关键字的使用,在这种情况下它是可选的,或者可以由编译器推断,它表明我们要引用实例上的成员 的类,而不是在正在执行的代码行的相同方法范围内可能具有相同名称的变量。 -
最后,在
this
的 click 事件处理程序中,我们可以获取之前存储在label1
属性中的值StoredText
实例。Form1
get 是我们用来从 c# 中的属性访问值的术语
private void label1_Click(object sender,EventArgs e) { // Get the "StoredText" variable and use it label1.Text = this.StoredText; }
不是必需的,但有助于了解我们正在访问当前方法范围之外的成员。
这看起来像:
this
您可能没有注意到 namespace Example
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>Saved value from see <see href="textBox1"/></summary>
public string StoredText { get; set; }
private void button1_Click(object sender,EventArgs e)
{
this.StoredText = textBox1.Text;
}
private void label1_Click(object sender,EventArgs e)
{
// Get the "StoredText" variable and use it
label1.Text = this.StoredText;
}
}
}
和 textBox1
本身实际上是 label1
,当 instance variables
在 构造函数。
因此,您根本不需要存储该值,您可以简单地为 InitializeComponent()
重新编写客户端事件处理程序以直接写入 button1
:
label
可以在没有中间存储的情况下直接在方法之间传递变量,这是另一天的教训,将涉及 label1.Text = textBox1.Text;
语句和/或 return
的方法。
但是,在这种情况下,这些方法的 parameters
或其他参数都不能使用,因为这些是事件处理程序,需要特定的方法签名才能按预期运行。
你快到了。面向对象编程中的常见做法是在类中拥有私有变量,以便共享状态。在您的班级中添加一个变量。它将在所有方法中可用,并可用于在它们之间共享数据(这是许多方法中的一种):
namespace Example
{
public partial class Form1 : Form
{
private string inputText { get; set; }
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender,EventArgs e)
{
inputText = textBox1.Text;
}
private void label1_Click(object sender,EventArgs e)
{
// Get the "text" variable and use it
label1.Text = inputText;
}
}
}