C#全局变量

Mas*_*jum 88 c# variables scope

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

Tom*_*zzo 106

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
}
Run Code Online (Sandbox Code Playgroud)

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

String code = Globals.CODE_PREFIX + value.ToString();
Run Code Online (Sandbox Code Playgroud)

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

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

  • 嗯,这没有必要,但我不明白你为什么要实例化它. (4认同)
  • 如果没有静态属性,您的类将是可实例化的(Globals g = new Globals())。它不会改变内部声明的静态变量的行为,但它看起来并不真正有用。 (2认同)

Fed*_*gui 70

在C#中没有全局变量这样的东西.期.

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

public static class MyStaticValues
{
   public static bool MyStaticBool {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

  • 我现在意识到我的意思是*静态成员在概念上和实际上是**全局变量***(除了那个[堆积的东西](http://stackoverflow.com/questions/79923/what-and-where-是堆栈和堆栈,只会产生差异*[除非您编写不安全的代码或与非托管代码进行某种重复的互操作](http://blogs.msdn.com/b/ericlippert/archive /2010/09/30/the-truth-about-value-types.aspx)*).所以我不知道为什么会有人说"*csharp*中没有全局变量这样的东西".这让我很困惑. (7认同)
  • @cawas因为"全局变量"的概念(悬而未决,浮在空中,不属于任何类)违背了OOP的本质.而C#是严格面向对象的. (3认同)

Dee*_*101 21

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

我们假设它通过了测试.根据使用情况,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.
}
Run Code Online (Sandbox Code Playgroud)

从其他类(在相同的命名空间内)的用法

// Read
bool areWeAlive = Globals.Expired;

// Write
// past deadline
Globals.Expired = true;
Run Code Online (Sandbox Code Playgroud)

  • “首先检查你是否真的需要一个全局变量,而不是公然使用它,而不考虑你的软件架构。” - 问题没有问“我应该在 C# 中使用全局变量”,而是问“如何在 C# 中创建全局变量” C#” (2认同)

Zot*_*tta 6

一个有用的功能是 using static

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

public static class Globals {
    public const float PI = 3.14;
}
Run Code Online (Sandbox Code Playgroud)

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

using static Globals;
[...]
Console.WriteLine("Pi is " + PI);
Run Code Online (Sandbox Code Playgroud)