0

C# を使用して WinForms アプリケーションを作成しています。プログラム全体でアクセスする変数を宣言したいのですが、初期化する場所がわかりません。

プログラムは BStree ベースで、これは私が初期化しようとしているものです:

BSTree<string> record = new BSTree<string>();
4

2 に答える 2

3

プログラムが些細なものである場合 (例: フォームが 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.Recordrecordこれにより、基になるメンバーに直接アクセスできます。

しかし、より堅牢なアプローチは、メンバーをコンシューマーに直接公開するのではなく、コンシューマーに代わってメンバーに対して動作する特定のメソッドを作成することです。そうすれば、許可される操作の種類を制限したり、特定の方法で結果を公開したりできます。つまり、単に「保持」するのではなく、基礎となるメンバーに値を追加しています。

于 2013-03-19T15:21:35.530 に答える
1
public static class MyStaticBStreeInstance
{
   public static BSTree Instance {get;private set;}
   static MyStaticBStreeInstance()
       {
          Instance = new BSTree<string>();
       }
}

どこからでも、以下のコードを使用してアクセスできます

 var bstree = MyStaticBStreeInstance.Instance 
于 2013-03-19T15:22:07.527 に答える