0

次のように定義された列挙があると仮定します。

public enum Beep
{
  HeyHo,
  LetsGo
}

次の特性を改善することは可能かと思います。

public Dictionary<Beep, String> Stuff{ get; set; }
...
String content = Stuff[Beep.HeyHo]

今のところ、辞書を取得して、必要な要素を選択しているからです。(a)可能かどうか、もしそうなら(b)この擬似コードのようなものを作成することをお勧めします。

public String Stuff{ get<Beep>; set<Beep>; }
...
String content = Stuff[Beep.HeyHo]
4

3 に答える 3

2

クラスにインデクサーを適用できます。

カプセル化が向上するため、推奨されます。たとえば、元のコードを使用して Dictionary を別の辞書に完全に置き換えることは完全に可能です。これは望ましくない可能性があります。

public class MyClass
{
    // Note that dictionary is now private.
    private Dictionary<Beep, String> Stuff { get; set; }

    public String this[Beep beep]
    {
        get
        {
            // This indexer is very simple, and just returns or sets 
            // the corresponding element from the internal dictionary. 
            return this.Stuff[beep];
        }
        set
        {
            this.Stuff[beep] = value;
        }
    }

    // Note that you might want Add and Remove methods as well - depends on 
    // how you want to use the class. Will client-code add and remove elements,
    // or will they be, e.g., pulled from a database?
}

使用法:

MyClass myClass = new MyClass();
string myValue = myClass[Beep.LetsGo];
于 2013-03-04T13:16:21.690 に答える
1

インデクサーを使用することもできます。

class MyClass
{
    private readonly Dictionary<Beep, string> _stuff = new Dictionary<Beep, string>();

    public string this[Beep beep]
    {
        get { return _stuff[beep]; }
        set { _stuff[beep] = value; }
    }
}

今、電話する代わりに

var obj = new MyClass();
string result = obj.Stuff[Beep.HeyHo];

あなたは呼び出すことができます

var obj = new MyClass();
string result = obj[Beep.HeyHo];

インデクサーはプロパティとほぼ同じように機能しますが、少なくとも 1 つの引数がインデックスとして使用されます。クラスごとに 1 つのインデクサーしか持つことができませんが、そのさまざまなオーバーロードを作成できます。メソッドと同じオーバーロード規則が適用されます。

于 2013-03-04T13:20:02.957 に答える
0

このようなものを使用してIndexer

public class Stuff
{
    public Dictionary<Beep, String> _stuff { get; set; }
    public enum Beep
    {
        HeyHo,
        LetsGo
    }

    public Stuff()
    {
        _stuff = new Dictionary<Beep, string>();
        // add item
        _stuff[Beep.HeyHo] = "response 1";
        _stuff[Beep.LetsGo] = "response 2";
    }

    public string this[Beep beep]
    {
        get { return _stuff[beep]; }
    }
}

サンプル使用法:

public static class Program
{
    private static void Main()
    {
        Stuff stuff = new Stuff();

        string response;
        response = stuff[Stuff.Beep.HeyHo]; // response 1
        response = stuff[Stuff.Beep.LetsGo]; // response 2

    }
}
于 2013-03-04T13:18:07.297 に答える