119

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

4

4 回答 4

159

C#你不能定义真正的全局变量(从某种意义上说它们不属于任何类)。

话虽这么说,我知道模仿此功能的最简单方法是使用 a 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.
于 2013-01-16T21:43:52.223 回答
81

C# 中没有全局变量之类的东西。时期。

如果需要,您可以拥有静态成员:

public static class MyStaticValues
{
   public static bool MyStaticBool {get;set;}
}
于 2013-01-16T21:28:18.033 回答
26

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

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

  1. 将所有此类全局变量包装到一个static类中(为了便于管理)。
  2. 有属性而不是字段(='变量')。这样,您就有了一些机制来解决将来并发写入 Globals 的任何问题。

这样一个类的基本大纲是:

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;
于 2013-10-31T16:19:07.070 回答
7

一个有用的功能是using static

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

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

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

using static Globals;
[...]
Console.WriteLine("Pi is " + PI);
于 2019-06-12T19:50:41.807 回答