如何在C#中创建全局变量?

时间:2016-07-28 09:12:29

标签: c# asp.net .net

我需要在.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);
}

因此,我需要在全球范围内创建它!

3 个答案:

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