回答:
では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
。C#にはグローバル変数などはありません。限目。
必要に応じて、静的メンバーを持つことができます。
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
static
あなたが提供したそのまさにその例が本当にグローバル変数と見なすことができないという正当な理由を考えようとしていました。
まず、ソフトウェアアーキテクチャを考慮せずに露骨にグローバル変数を使用する代わりに、グローバル変数が本当に必要かどうかを調べます。
テストに合格したとしましょう。使用方法によっては、競合状態やその他の多くの「悪いこと」でグローバルをデバッグするのは難しい場合があります。そのような悪いことを処理する準備ができている角度からアプローチすることをお勧めします。そう、
static
クラスにラップします(管理性のため)。このようなクラスの基本的な概要は次のとおりです。
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);