2012-02-15 119 views
4

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

例如: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()

谢谢!

回答

24

通常你把它作为一个参数,像这样:

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. 其他一些在服务器端持久保存数据的手段等。
0

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

0

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

要使变量对两个方法都可见,可以在包含方法的类中创建一个字段。如果这些方法处于不同的类别中,那么解决方案会变得更加复杂。

7

您需要在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

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(); 
0

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

public partial class Form1 : Form 
{ 
    string a; 

    // etc ... 
} 
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. 
    } 
} 
-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;

+0

这样一个坏实践。为了完成小型工作,不建议使用这种方法。 – 2017-05-04 09:40:47

相关问题