【问题标题】:Referencing a variable from another method从另一个方法引用变量
【发布时间】:2012-03-07 06:08:33
【问题描述】:

我是 C# 新手,我真的需要知道如何从另一个方法调用/使用字符串。

例如:

public void button1_Click(object sender, EventArgs e)
{ 
    string a = "help";
}

public void button2_Click(object sender, EventArgs e)
{
    //this is where I need to call the string "a" value from button1_click 
    string b = "I need ";
    string c = b + a;          
}

在这个例子中,我需要从函数button2_Click()调用函数button1_Click()中定义的字符串“a

【问题讨论】:

    标签: c# methods call


    【解决方案1】:

    通常你会将它作为参数传递,如下所示:

    void Method1()
    {
        var myString = "help";
        Method2(myString);
    }
    
    void Method2(string aString)
    {
        var myString = "I need ";
        var anotherString = myString + aString;
    }
    

    然而,您示例中的方法是事件侦听器。你一般不直接打电话给他们。 (我想你可以,但我从来没有找到一个实例应该。)所以在这种特殊情况下,将值存储在一个公共的两个方法使用的类内的位置。像这样的:

    string StringA { get; set; }
    
    public void button1_Click(object sender, EventArgs e)
    { 
       StringA = "help";
    }
    
    public void button2_Click(object sender, EventArgs e)
    {
        string b = "I need ";
        string c = b + StringA;
    }
    

    但是请注意,这在 ASP.NET 中的行为会非常不同。因此,如果这就是您正在使用的东西,那么您可能希望更进一步。它表现不同的原因是因为服务器端是“无状态的”。因此,来自客户端的每个按钮单击都将导致该类的全新实例。因此,在第一个按钮单击事件处理程序中设置该类级成员时,在第二个按钮单击事件处理程序中使用它时不会反映出来。

    在这种情况下,您需要查看 Web 应用程序中的持久状态。选项包括:

    1. 页面值(例如隐藏字段)
    2. Cookie
    3. 会话变量
    4. 应用程序变量
    5. 一个数据库
    6. 服务器端文件
    7. 其他一些在服务器端持久化数据的方法,等等。

    【讨论】:

      【解决方案2】:

      你需要在class的范围内声明string a,而不是方法,此时它是一个“局部变量”。

      例子:

      private string a = string.Empty;
      
      public void button1_Click(object sender, EventArgs e) 
      {  
          a = "help"; 
      } 
      
      public void button2_Click(object sender, EventArgs e) 
      { 
          //this is where I need to call the string "a" value from button1_click  
          string b = "I need"; 
          string c = b + a;           
      } 
      

      您现在可以从class 中的任何位置访问“私有字段”a 的值,在您的示例中为Form

      【讨论】:

        【解决方案3】:

        同意@Devid 的回答,但我更喜欢创建一类必需的实体,然后在整个解决方案中使用它们而不将变量作为参数传递。

        Classname.variableName;
        

        前-

         Class argumentData{
        public static string firstArg= string.Empty;
        public static string secArg= string.Empty;
        }
        

        假设我在函数中分配数据

        void assignData()
        {
        argumentData.firstArg="hey";
        argumentData.secArg="hello";
        }
        

        如果我想在其他方法中使用它,那么

        void showData()
        {
        Console.WriteLine("first argument"+argumentData.firstArg);
        Console.WriteLine("sec argument"+ argumentData.secArg);
        }
        

        希望这会有所帮助!

        【讨论】:

        • 别忘了在需要的地方检查空字符串!
        【解决方案4】:

        将其重构为方法调用(或属性),以便您可以在应用程序的其他位置访问 a 的值:

        public String GetStringAValue() {
            return "help";
        }
        
        public void button1_Click(object sender, EventArgs e) {
            string a = GetStringAValue();
        }
        
        public void button2_Click(object sender, EventArgs e) {
            string a = GetStringAValue();
            string b = "I need";
            string c = b + a;
        }
        

        还请注意,您可能正在使用隐式类型声明。实际上,这些是等效的声明:

        string a = GetStringAValue();
        var a = GetStringAValue();
        

        【讨论】:

          【解决方案5】:

          make 是一个类级变量(全局变量)或为 String a 创建一个 getter 和 setter,以命名几个选项。

          【讨论】:

            【解决方案6】:

            你不能那样做。 string a 是一个局部变量声明。它被称为“局部”,因为它只能“局部”访问它所在的块。

            要使变量对两种方法都可见,您可以在包含方法的类中创建一个字段。但是,如果方法位于不同的类中,则解决方案会变得更加复杂。

            【讨论】:

              【解决方案7】:

              你不能这样做,因为这些变量在不同的scopes 中(认为它被隐藏了)。实现这一点的唯一方法是在主窗体类中移动 a:

              public partial class Form1 : Form
              {
                  string a;
              
                  // etc ...
              }
              

              【讨论】:

                【解决方案8】:
                class SomeClass
                {
                    //Fields (Or Properties)
                    string a;
                
                    public void button1_Click(object sender, EventArgs e)
                    { 
                        a = "help"; //Or however you assign it
                    }
                
                    public void button2_Click(object sender, EventArgs e)
                    {
                        string b = "I need";
                        string c = b + (a ?? String.Empty); //'a' should be null checked somehow.
                    }
                }
                

                【讨论】:

                  【解决方案9】:

                  你可以在这里使用会话

                  public void button1_Click(object sender, EventArgs e)
                  { 
                  string a = "help";
                  Session["a"]=a;
                  }
                  public void button2_Click(object sender, EventArgs e)
                  { 
                  string d=Session["a"].ToString();        
                  string b = "I need ";
                  string c = b + d;          
                  }
                  

                  【讨论】:

                    【解决方案10】:

                    您可以将变量保存到文件中,然后稍后访问该文件,如下所示:

                    public void button1_Click(object sender, EventArgs e)
                    { 
                        string a = "help";
                        File.WriteAllText(@"C:\myfolder\myfile.txt", a); //Change this to your real file location
                    }
                    
                    public void button2_Click(object sender, EventArgs e)
                    {
                        string d = File.ReadAllText(@"C:\myfolder\myfile.txt");
                    
                        //this is where I need to call the string "a" value from button1_click 
                        string b = "I need";
                        string c = b + d; //Instead of a, put the variable name (d in this case)          
                    }
                    

                    如果您这样做,请确保将其放入您的代码中:using System.IO;

                    【讨论】:

                    • 这种不好的做法。不建议仅仅为了完成小工作而使用这种方法。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-01-07
                    • 2014-10-10
                    相关资源
                    最近更新 更多