web-dev-qa-db-ja.com

C#でグローバル変数を使用する方法

インスタンス参照なしですべてのクラス(* .cs)がその内容にアクセスできるように変数を宣言する方法を教えてください。

85
Mas Ajum

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に含めずに宣言します(グローバルアプリケーション名前空間に配置されます)。
  • 別のnamespaceから変数を取得するための適切なusingディレクティブを挿入します。
99

C#にはグローバル変数のようなものはありません。期間。

必要に応じて、静的メンバーを持つことができます。

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

あなたのソフトウェアアーキテクチャを考慮せずにそれを露骨に使う代わりに本当にグローバル変数が必要かどうかを最初に調べてください。

テストに合格したとしましょう。使用法によっては、Globalsは競合状態や他の多くの「悪いもの」でデバッグするのが難しい場合があります。そのような悪いものを処理する準備ができている角度からそれらをアプローチすることが最善です。そう、

  1. そのようなグローバル変数をすべて単一のstaticクラスにラップします(管理しやすくするため)。
  2. フィールド(= '変数')の代わりにプロパティを持ちます。このようにして、将来的にグローバルへの同時書き込みに関する問題に対処するためのメカニズムがいくつかあります。

そのようなクラスの基本的な概要は次のようになります。

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;
21
DeepSpace101

これに便利な機能は using static です。

他の人が言ったように、あなたはあなたのグローバルのためのクラスを作成しなければなりません:

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

しかし、静的プロパティの前にクラス名を記述しなくなるために、このようにインポートすることができます。

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