我需要在.net项目中使用全局变量。但是,我无法在两种方法之间处理它..
我的代码:
string str;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
str = "i am a string";
showString();
}
}
void showString()
{
aspLabel.Text = str; //error
}
问题更新:
我不会考虑使用showString(str)
,因为这个变量使用了很多方法。例如,我有一个需要使用它的click事件。
protected void Btn_Click(object sender, EventArgs e)
{
exportToExcel(str);
}
因此,我需要在全球范围内创建它!
答案 0 :(得分:10)
答案是不要做全局变量(你也不能)。
最接近Global
的是static
并且有static
成员的类 - 但我认为对大多数情况来说这是错误的做法。 Static
类/成员通常会使代码更加耦合并降低可测试性,因此在您决定这样做时请仔细选择。
改为:(传递参数)
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string str = "i am a string";
showString(str);
}
}
void showString(string str)
{
aspLabel.Text = str;
}
或者:
public class SomeClass
{
private string str;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
str = "i am a string";
showString();
}
}
protected void Btn_Click(object sender, EventArgs e)
{
exportToExcel(str);
}
void showString()
{
aspLabel.Text = str;
}
}
在这里,您可以根据需要将str
更改为属性或其他访问修饰符,但这是一般的想法。
如果您将其作为公共而非私有,则可以从包含此类实例的不同类访问它。像这样:
public class SomeClass
{
public string Str { get; private set; }
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Str = "i am a string";
showString();
}
}
protected void Btn_Click(object sender, EventArgs e)
{
exportToExcel(Str);
}
void showString()
{
aspLabel.Text = Str;
}
}
public class SomeOtherClass
{
public SomeOtherClass()
{
SomeClass someClass = new SomeClass();
var otherStr = someClass.Str;
}
}
答案 1 :(得分:3)
如前所述,不要做全局变量。而是将参数传递给方法。
让发生的事情稍微明显一点:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string str = "i am a string";
showString(str);
}
}
void showString(string nowthis) // nowthis == str, value is copied in
{
aspLabel.Text = nowthis;
}
答案 2 :(得分:2)
C#中没有全局变量的概念。
你可以拥有像这样的静态成员
public static class MyClassWithStatics
{
public static string MyString {get;set;}
}
然后,在另一个课程中,您可以参考它:
public class MyOtherClass
{
public void MyMethod()
{
var str = MyClassWithStatics.MyString;
}
}