2017-08-10 12 views
-1

誰かが特定の関数を呼び出すたびに作成する辞書があります。問題は、別の場所で辞書が必要なことです。私はGoogleを使いましたが、私の特定の問題については何も私を助けません。別の辞書の作成を防ぐ方法

例: 私はその後、私はどこにでも

public static IDictionary<int, int> CreateDict() 
    { 
    Dict = new Dictionary<int, int>(); 
    return Dict; 
    } 

それを使用して作成した辞書を返すようにしてみてくださいしかし、今、私はスクリプトが作成されていないことを確認する必要がありdictの

private void ConnectFunc(client) 
    { 
    CreateDict(); 
    } 

を作成新しい辞書をもう一度、どのように可能ですか? (私はちょうどC#の学習を始めましたので、説明して、私が間違っていることを教えてください)。

答えて

1

だから何あなたがやろうとしていることは、 "シングルトン" パターンです。 「シングルトン」は基本的に、オブジェクトのインスタンスを1つしか持たないことを意味します。

簡単な例:シングルトンと心に留めておくべき

private static IDictionary<int, int> _dict = null; 
public static IDictionary<int, int> CreateDict() 
{ 
    if(_dict == null) 
    { 
     _dict = new Dictionary<int, int>(); 
    } 
    return _dict; 
} 

一つのことは、しかし、スレッドセーフです。上記の例では、あるスレッドがnullをチェックすると同時に、別のスレッドがnullをチェックするとどうなりますか?彼らは両方とも、_dictがヌルであり、新しいディクショナリを作成することを発見します。今、あなたはそこに浮かぶ2つのユニークな辞書を持っています。

これを処理する私の好きな方法は、blog post Jon Skeetが書いたものです。

private static Lazy<IDictionary<int, int>> _lazyDict = 
     new Lazy<IDictionary<int, int>>(() => new Dictionary<int, int>()); 

public static IDictionary<int, int> Dict { get { return lazy.Value; } } 

このアプローチは、スレッドセーフであると怠惰ロードされるという利点があり、プラス(それがない、すべてが新しい辞書を作成している場合)あなたがCreateDict()機能を排除することができます。これは、.NET 4のLazy<T>タイプを採用しています。

+0

これはかなりうまくいく、本当にありがとう(真剣に私に多くの時間を救った) – Spoderpls

+0

あなたは大歓迎です!私は一般的なデザインパターンを読んでみることをお勧めします。[this](http://www.dofactory.com/net/design-patterns)は常に私にとって良いリソースでした。 – maccettura

1

Singleton pattern

を見てそれはあなたが多くのことを学びます、早い段階での基本的なデザインパターンを理解するのに役立ちますを持っています。

編集:例

public sealed class MyDictionary 
{ 
    private static readonly Dictionary<int, int> instance = new Dictionary<int, int>(); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static MyDictionary() 
    { 
    } 

    private MyDictionary() 
    { 
    } 

    public static IDictionary<int, int> Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 

使用法:

private void ConnectFunc(client) 
{ 
    // get the singleton instance of your dictionary: MyDictionary.Instance 
} 
+6

少なくとも、基本的な例をリンク –

+0

と一緒に投稿する必要があります。 downvotesを削除していただければ幸いです。 –

関連する問題