インスタンス参照なしですべてのクラス(* .cs)がその内容にアクセスできるように変数を宣言する方法を教えてください。
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ディレクティブを挿入します。C#にはグローバル変数のようなものはありません。期間。
必要に応じて、静的メンバーを持つことができます。
public static class MyStaticValues
{
public static bool MyStaticBool {get;set;}
}
あなたのソフトウェアアーキテクチャを考慮せずにそれを露骨に使う代わりに本当にグローバル変数が必要かどうかを最初に調べてください。
テストに合格したとしましょう。使用法によっては、Globalsは競合状態や他の多くの「悪いもの」でデバッグするのが難しい場合があります。そのような悪いものを処理する準備ができている角度からそれらをアプローチすることが最善です。そう、
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);