如何在C#中的方法之间传递变量?

如何在C#中的方法之间传递变量?,c#,winforms,instance-variables,C#,Winforms,Instance Variables,我试图构建一个程序,但我意识到我无法访问某个变量,因为它是用另一种方法创建的 如何将变量转移到另一个方法 这是我试图做的一个例子: namespace Example { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object

我试图构建一个程序,但我意识到我无法访问某个变量,因为它是用另一种方法创建的

如何将变量转移到另一个方法

这是我试图做的一个例子:

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
的表单,其中有一个名为
button1
的按钮,一个名为
textbox1
的文本框和一个名为
label1
的标签

您正在尝试的场景是:

  • 用户在
    textbox1
  • 用户单击
    按钮1
    ,这将保存
    文本框1
  • 用户单击
    标签1
    ,这将显示上一步中存储的值
  • 重要的是要了解,在这种情况下,我们不会尝试在两种方法之间传递值,因为按钮单击和标签单击可以彼此独立地发生,所以这实际上就像计算器上的内存存储(M+)和内存调用(MR)按钮一样。 要实现此存储,您应该在
    Form1
    类上创建一个实例变量(有时称为成员变量),这将可供
    Form1
    类的同一实例上的其他方法访问

    有关实际解释,请参阅

  • 创建一个字段或属性来存储值,对于您的特定示例,这两种方法都可以,但是要熟悉C#技术,我建议您从属性开始,因为这样可以更好地封装存储值的场景,以供以后使用,并有可能增加值实际存储的方式和位置

    有关健康的讨论,请参阅
    在需要更改实现之前,您只需使用

  • 现在,在
    button1
    的click事件处理程序中,我们可以在
    Form1
    实例上设置
    StoredText
    属性的值

     private void button1_Click(object sender, EventArgs e)
     {
         this.StoredText = textBox1.Text;
     }   
    
    在c语言中,set是一个用于将值保存到属性中的术语# 注意
    this
    关键字的使用,在这种情况下它是可选的,或者可以由编译器推断,它表示我们希望引用类实例上的一个成员,而不是在正在执行的代码行的相同方法范围内具有相同名称的变量

  • 最后,在
    label1
    的click事件处理程序中,我们可以获得先前存储在
    Form1
    实例的
    StoredText
    属性中的值

     private void label1_Click(object sender, EventArgs e)
     {
         // Get the "StoredText" variable and use it
         label1.Text = this.StoredText;
     }
    
    get是一个术语,我们使用它从c中的属性访问值#
    不是必需的,但有助于理解我们正在访问当前方法范围之外的成员

  • 这看起来像:

    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;
            }
        }
    }
    

    可以在方法之间直接传递变量,而无需中间存储,这是另一天的课程,将涉及方法上的
    return
    语句和/或
    parameters

    但是,在这种情况下,这些方法上的
    返回
    或其他参数都不能使用,因为这些是需要特定方法签名才能按预期操作的事件处理程序。

    通常,您会从方法返回一些内容。或者,该方法可能会为其类的属性指定一个值,然后您可以访问该属性。这完全取决于上下文。如果您想要一个更明确的答案,请展示您现有的代码,并准确地解释您要做的事情。您可以阅读有关带有参数和返回值的方法的内容。感谢您花时间分享您的问题。你的要求不清楚/缺少什么。你的目标和困难是什么?到目前为止你做了什么?请尝试更好地解释您的问题、开发环境、数据类型和预期结果,以及或多或少地共享代码(无屏幕截图)、示例、屏幕图像或草图、用户故事或场景图。为了帮助您改进您的请求,请阅读&。这是一个直接的回答,但也许应该说些什么?这在Windows窗体世界中并不常见,但也许应该如此(尤其是对于大型项目)。感谢@PeterMortensen,我希望在现阶段通过引导OP在字段上使用属性就足够了,但作为MVVM的有力倡导者,即使在窗体中,我也应该在这个问题上更有力一点。我担心我的个人偏见会妨碍我在没有压倒性的行动的情况下提供切实可行的建议。
     private void label1_Click(object sender, EventArgs e)
     {
         // Get the "StoredText" variable and use it
         label1.Text = this.StoredText;
     }
    
    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;
            }
        }
    }
    
    label1.Text = textBox1.Text;