C# を使用して WinForms アプリケーションを作成しています。プログラム全体でアクセスする変数を宣言したいのですが、初期化する場所がわかりません。
プログラムは BStree ベースで、これは私が初期化しようとしているものです:
BSTree<string> record = new BSTree<string>();
C# を使用して WinForms アプリケーションを作成しています。プログラム全体でアクセスする変数を宣言したいのですが、初期化する場所がわかりません。
プログラムは BStree ベースで、これは私が初期化しようとしているものです:
BSTree<string> record = new BSTree<string>();
プログラムが些細なものである場合 (例: フォームが 1 つだけで、追加のクラス ファイルがないなど) (例: 簡単な学校の課題)、Form
クラス内で静的グローバルを宣言するだけで、メソッドの外側にある可能性があります。
public class MyForm : Form
{
static private BSTree<string> record = new BSTree<string>();
public MyForm()
{
...
}
...
}
そして、MyForm
例としてインスタンス内からアクセスしますMyForm.record
。
また、メソッドの外側で変数 (eg )を宣言することもできますが、コンストラクタ内などから(eg に)初期化することもできます。2 つのアプローチには非常に微妙な違いがあります (つまり、さまざまなメンバーが初期化される順序に影響します) が、これが重要になることはめったにありません。static private BSTree<string> record;
new BSTree<string>()
メンバーはclassstatic
に「属している」ため、そのメンバーの「バージョン」は 1 つだけであることに注意してください。つまり、クラスのインスタンスごとにそのメンバーの個別の「バージョン」はありません。
しかし、それ以外の場合は、静的な「構成」または「グローバル」クラスがあり、これらの値 (および構成ファイルなどから読み取られる他の値) が含まれている可能性があります。
public static class MyConfig
{
static public BSTree<string> record = new BSTree<string>();
...
}
MyForm
のようにクラス内からこれにアクセスしますMyConfig.record
。
ただし - 理想的には、フィールドではなくプロパティを公開する必要があります。例:
public static class MyConfig
{
static private BSTree<string> record = new BSTree<string>();
static public BSTree<string> Record
{
get {return record;}
set {record = value;}
}
...
}
MyForm
のようにクラス内からこれにアクセスしますMyConfig.Record
。record
これにより、基になるメンバーに直接アクセスできます。
しかし、より堅牢なアプローチは、メンバーをコンシューマーに直接公開するのではなく、コンシューマーに代わってメンバーに対して動作する特定のメソッドを作成することです。そうすれば、許可される操作の種類を制限したり、特定の方法で結果を公開したりできます。つまり、単に「保持」するのではなく、基礎となるメンバーに値を追加しています。
public static class MyStaticBStreeInstance
{
public static BSTree Instance {get;private set;}
static MyStaticBStreeInstance()
{
Instance = new BSTree<string>();
}
}
どこからでも、以下のコードを使用してアクセスできます
var bstree = MyStaticBStreeInstance.Instance