3

次のパブリック変数を設定しようとしています:

var collection = new Dictionary<string, Statistics>();

アプリケーション全体で同じコレクションを使用できるようにしたいので、アプリケーションの起動時に一番上にコレクションを作成したいと考えています。

どうすればいいですか?

4

4 に答える 4

6

C#にはグローバル変数の概念はありません。クラス/スコープ内で常に変数を宣言する必要があります。

あなたができることpublicは、プロパティのように修飾子を介してアクセスできるようにすることです(たとえば)。

ただのアイデア:

public class Shared
{
     public Dictionary<string, Statistics> CollectionDic {get;set;}

     public Shared() {
        CollectionDic  = new Dictionary<string, Statistics>();
     }
}

次のようにアクセスできるようになったら:

var shared = new Shared(); 
shared.CollectionDic.Add(..)
...

正確なニーズに合わせて、自分でトレーニングする必要があります。

于 2012-11-30T07:46:45.740 に答える
5

パブリッククラスのパブリック静的フィールドまたはプロパティとして作成できます(オプションで静的でもあります):

public class Variables
{
    public static Dictionary<string, Statistics> collection = new Dictionary<string, Statistics>();
}

次に、コードでアクセスします。

Variables.collection.Add(...);

これはスレッドセーフなアプローチではないことに注意してください。したがって、マルチスレッドアプリで静的辞書を使用する場合は、静的メソッドを使用して辞書をスレッドセーフな方法でラップするか (Jon Skeet が述べたように)、スレッドセーフなコレクションを使用することをお勧めします (例: ConcurrentDictionary ) 。

于 2012-11-30T07:48:09.117 に答える
2

編集

OPのコメントは、要件は1つの.csコードを介して変数にアクセスできることだけであることを示しました。以下の内容は無視してください。また、このトピックの今後の訪問者にとって、この回答が質問に追加する価値がないと思われる場合は、削除に投票してください。または、滞在するのに十分な付加価値があると思われる場合は、投票してください。


元の質問で私が意味したことは、I want to be able to use the same collection all through my application

オブジェクト指向環境で、これがアプリケーションのリファクタリング/再構築によって超えられない要件である場合は、Singleton デザイン パターンを使用する必要があります。

シングルトンは、特定のクラスのインスタンスが 1 つだけ存在すること (もちろん、アプリケーション コンテキスト/仮想マシンごとに) を保証するパターンであり、そのインスタンスは同じアプリケーションのコンテキスト内のどこからでもアクセスできることを保証します。

あれは:

  • クラスを作成します (例: MyDictionary という名前で)
  • そこから必要な機能を実装します(これを基礎となる実装から独立させたい)
  • 記事に従ってシングルトンにする
    • 遅延読み込みが必要かどうかを判断する
    • 望ましくない結果を避けるために、シングルトンを扱うときは常にスレッドセーフな実装を使用することをお勧めします。
  • いつでもアクセス

例: (C#Indepth リンクの 2 番目のバージョンから、単純なスレッド セーフを備えているため、記事の著者が誰であるかに注意してください!)

public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object padlock = new object();

    Singleton()
    {
    }    

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }    
    }
} 

注意してください常にスレッドセーフを考慮してください!

@JonSkeet からの応答を受け取ったので (いいね!)、答えの背後にある論理的根拠を説明する必要があると思います。

長所:

  • そうするための非標準的な方法を使用するよりも優れています
  • 存在するコードのすべてのビットにそれを渡す必要があるよりも優れています

短所:

  • この要件を回避できる場合は、絶対にお勧めしません
  • シングルトンマップを持つことは深刻な悪臭です:アプリケーションの存続期間中参照を保持し、多くの場合、大規模なリークにつながります
  • マルチスレッドの動作は些細なことではなく、何かがごくまれにしか動作しない場合 (隠された競合状態、および悪夢の中でプログラマーのベッドの下に潜んでいるその他のもの) を追跡するのは特に困難です。

また読むことをお勧めします:

于 2012-11-30T07:45:58.713 に答える
2

あなたが得ているエラーは次のとおりです。

コンテキスト キーワード 'var' は、ローカル変数宣言内でのみ使用できます

コレクションを次のように定義しようとしていると思います。

public partial class Form1 : Form
{
    var collection = new Dictionary<string, Statistics>();

varこのレベルではキーワードを使用できません。

別の .cs ファイルではなく、すべての Form1.cs からアクセスできるようにしたい

次のように定義できます。

Dictionary<string, Statistics> collection = new Dictionary<string, Statistics>();

Form1 クラス内のすべてのメソッドで使用できます。

于 2012-11-30T07:49:06.663 に答える