C#引用另一个方法的变量

时间:2012-02-15 20:54:01

标签: c# methods call

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

因此,在此示例中,我需要调用函数button1_Click()中函数button2_Click()中定义的字符串“ a

谢谢!

10 个答案:

答案 0 :(得分:29)

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

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. 缓存
  3. 会话变量
  4. 应用程序变量
  5. 数据库
  6. 服务器端文件
  7. 在服务器端保留数据等的其他一些方法

答案 1 :(得分:8)

您需要在string a的范围内声明class,而不是方法,此时它是“本地变量”。

示例:

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

您现在可以从a内的任何位置访问“私人字段”class的值,在您的示例中该Form将是{{1}}。

答案 2 :(得分:2)


您可以在此处使用会话

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

答案 3 :(得分:1)

将其重构为方法调用(或属性),以便您可以在应用程序的其他位置访问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();

答案 4 :(得分:1)

同意@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);
}

希望这会有所帮助!

答案 5 :(得分:0)

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

答案 6 :(得分:0)

你做不到。 string a是一个局部变量声明。它被称为“本地”,因为它只能在“本地”访问它发生的块。

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

答案 7 :(得分:0)

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

public partial class Form1 : Form
{
    string a;

    // etc ...
}

答案 8 :(得分:0)

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 :(得分:-2)

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

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;