C#全局变量

时间:2013-01-16 21:26:08

标签: c#

如何在C#中声明一个变量,以便每个类(* .cs)都可以访问其内容而无需实例引用?

4 个答案:

答案 0 :(得分:97)

C#中,你无法定义真正的全局变量(在某种意义上它们不属于任何类)。

话虽如此,我所知道的模仿此功能的最简单方法是使用static class,如下所示:

public static class Globals
{
    public const Int32 BUFFER_SIZE = 512; // Unmodifiable
    public static String FILE_NAME = "Output.txt"; // Modifiable
    public static readonly String CODE_PREFIX = "US-"; // Unmodifiable
}

然后,您可以在代码中的任何位置检索定义的值(假设它是同一namespace的一部分):

String code = Globals.CODE_PREFIX + value.ToString();

为了处理不同的命名空间,您可以:

  • 声明Globals类,而不将其包含在特定的namespace中(以便将其放置在全局应用程序命名空间中);
  • 插入正确的using指令,用于从另一个namespace中检索变量。

答案 1 :(得分:67)

C#中没有全局变量这样的东西。周期。

如果您愿意,可以拥有静态成员:

public static class MyStaticValues
{
   public static bool MyStaticBool {get;set;}
}

答案 2 :(得分:21)

首先检查你是否真的需要一个全局变量,而不是考虑你的软件架构而公然使用它。

让我们假设它通过了测试。根据使用情况,Globals很难根据竞争条件和许多其他“坏事”进行调试,最好从你准备处理这些坏事的角度来处理它们。所以,

  1. 将所有此类全局变量包装到单个static类中(用于可管理性)。
  2. 拥有属性而不是字段(='变量')。通过这种方式,您可以使用一些机制来解决将来对Globals进行并发写入的任何问题。
  3. 这类课程的基本大纲是:

    public class Globals
    {
        private static bool _expired;
        public static bool Expired 
        {
            get
            {
                // Reads are usually simple
                return _expired;
            }
            set
            {
                // You can add logic here for race conditions,
                // or other measurements
                _expired = value;
            }
        }
        // Perhaps extend this to have Read-Modify-Write static methods
        // for data integrity during concurrency? Situational.
    }
    

    来自其他类(在同一命名空间内)的用法

    // Read
    bool areWeAlive = Globals.Expired;
    
    // Write
    // past deadline
    Globals.Expired = true;
    

答案 3 :(得分:1)

using static

是一个有用的功能

正如其他人所说,您必须为全局变量创建一个类:

public static class Globals {
    public const float PI = 3.14;
}

但是您可以像这样导入它,以便不再在其静态属性前面编写类名:

using static Globals;
[...]
Console.WriteLine("Pi is " + PI);