次のパブリック変数を設定しようとしています:
var collection = new Dictionary<string, Statistics>();
アプリケーション全体で同じコレクションを使用できるようにしたいので、アプリケーションの起動時に一番上にコレクションを作成したいと考えています。
どうすればいいですか?
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(..)
...
正確なニーズに合わせて、自分でトレーニングする必要があります。
パブリッククラスのパブリック静的フィールドまたはプロパティとして作成できます(オプションで静的でもあります):
public class Variables
{
public static Dictionary<string, Statistics> collection = new Dictionary<string, Statistics>();
}
次に、コードでアクセスします。
Variables.collection.Add(...);
これはスレッドセーフなアプローチではないことに注意してください。したがって、マルチスレッドアプリで静的辞書を使用する場合は、静的メソッドを使用して辞書をスレッドセーフな方法でラップするか (Jon Skeet が述べたように)、スレッドセーフなコレクションを使用することをお勧めします (例: ConcurrentDictionary ) 。
OPのコメントは、要件は1つの.csコードを介して変数にアクセスできることだけであることを示しました。以下の内容は無視してください。また、このトピックの今後の訪問者にとって、この回答が質問に追加する価値がないと思われる場合は、削除に投票してください。または、滞在するのに十分な付加価値があると思われる場合は、投票してください。
元の質問で私が意味したことは、I want to be able to use the same collection all through my application
オブジェクト指向環境で、これがアプリケーションのリファクタリング/再構築によって超えられない要件である場合は、Singleton デザイン パターンを使用する必要があります。
シングルトンは、特定のクラスのインスタンスが 1 つだけ存在すること (もちろん、アプリケーション コンテキスト/仮想マシンごとに) を保証するパターンであり、そのインスタンスは同じアプリケーションのコンテキスト内のどこからでもアクセスできることを保証します。
あれは:
例: (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 からの応答を受け取ったので (いいね!)、答えの背後にある論理的根拠を説明する必要があると思います。
長所:
短所:
また読むことをお勧めします:
あなたが得ているエラーは次のとおりです。
コンテキスト キーワード '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 クラス内のすべてのメソッドで使用できます。