【问题标题】:How to use Global Variables in C#?如何在 C# 中使用全局变量?
【发布时间】:2012-12-31 08:17:46
【问题描述】:

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

【问题讨论】:

    标签: c# variables scope


    【解决方案1】:

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

    【讨论】:

    • @Zarathos 类也必须是静态的吗?
    • 没有必要,但我不明白你为什么要实例化它。
    • 如果你必须实例化它的每个定义而不是“全局”,而不是应用程序状态的一部分
    • 您好,如果我不在类中键入 static 关键字会有什么不同?我只将字符串 FILE_NAME 设为静态,我试过了,它仍然对我有用。
    • 如果没有静态属性,您的类将是可实例化的(Globals g = new Globals())。它不会改变内部声明的静态变量的行为,但看起来并不是很有用。
    【解决方案2】:

    C# 中不存在全局变量。期间。

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

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

    【讨论】:

    • 虽然我同意,但请您详细说明为什么 C# 中没有全局变量之类的东西?我试图想一个很好的理由,为什么您提供的那个 static 示例不能真正被视为全局变量。
    • @cawas 因为“全局变量”的概念(无处不在,漂浮在边缘,不属于任何类)与 OOP 的本质背道而驰。而 C# 是严格面向对象的。
    • 是的,这就是我同意的所有概念。但是通过创建该静态成员,您只是创建了一种全局变量。这与您所说的不存在的全局变量有何不同?我想看一个实际的例子。
    • 我觉得你要么在回避我的问题,要么我不清楚。但我已经得到了答案。这里:stackoverflow.com/a/20010543/274502
    • 我现在意识到我的意思是静态成员在概念上和实际上都是全局变量(可能除了heap thing,它只会使区别unless you are writing unsafe code or doing some sort of heavy interoperating with unmanaged code)。所以我不知道为什么有人会说“csharp 中没有全局变量这样的东西”。这让我很困惑。
    【解决方案3】:

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

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

    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;
    

    【讨论】:

      【解决方案4】:

      一个有用的功能是using static

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

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

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

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

      【讨论】:

      • 谢谢!这个小技巧为我节省了 VBA 到 C# 转换的时间。
      猜你喜欢
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多