如何在 C # 中使用全局变量?

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

499264 次浏览

如果需要,可以使用静态成员:

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

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中检索变量。

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

假设它通过了测试。根据使用情况的不同,Globals 可能很难用竞态条件和许多其他“坏事情”进行调试,最好从准备处理这些坏事情的角度来处理它们。那么,

  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;

其中一个有用的特性是 using static

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

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

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

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