1

リストを含むAttributeというクラスがあります。指定された文字列がリストに存在する場合、getメソッドがtrue/falseを返すようにします。ただし、setメソッドで文字列を受け入れてリストに追加する必要があります。

私は便利なコンパイラを持っていませんが、私のコードは多かれ少なかれこのようになります。これは可能ですか?

class Attribute{

    private list<string> m_data;

    public bool this[string s] {
        get { return this.m_data.Contains[s]; }
        set { this.m_data.Add[s]; }
    }

}
4

4 に答える 4

2

はい、動作しますが、以下に示すように設定する必要があることに注意してください。プロパティのやや奇妙な使用法。true または false の値を設定すると、文字列がリストに追加されます。

attribute["Test String 1"] = true;
attribute["Test String 2"] = false;

文字列がリストに含まれているかどうかのテストは、予想どおりです。

Boolean result1 = attribute["Test String 1"]; // true
Boolean result2 = attribute["Test String 2"]; // true
Boolean result3 = attribute["Test String 3"]; // false
于 2012-12-10T21:05:20.580 に答える
2

最初はうまくいくかどうかわかりませんでしたが、試してみたところ、いくつかの調整を加えてコンパイルできました。

class Program {
    static void Main( string[ ] args ) {
        Attribute attribute = new Attribute( );
        attribute[ "string1" ] = true;
        attribute[ "string2" ] = false;

        Console.WriteLine( attribute[ "string1" ] ); //True
        Console.WriteLine( attribute[ "string2" ] ); //True        
        Console.WriteLine( attribute[ "string3" ] ); //False
    }
}

class Attribute {
    private List<string> m_data;

    public Attribute(){
        m_data = new List<string>();
    }

    public bool this[ string s ] {
        get { return this.m_data.Contains( s ); }
        set { this.m_data.Add( s ); }
    }
}

編集:

問題なく完全に機能しますが、非常にナンセンスに思えます。

于 2012-12-10T21:11:39.917 に答える
2

これは機能しますが、恐ろしく直感に反します。プロパティ (実際にはインデクサー) への代入には、ある種のブール値が含まれている必要があり、無視されて破棄されます。

Attribute a = new Attribute();
a["test"] = true;                 // Adds "test" as expected -- but WTF does the true mean?
a["foo"] = false;                 // Adds "foo" -- the false means nothing
Console.Out.WriteLine(a["test"]); // returns true

はい、これを行うことができます。しかし、コードを保守している人は何が起こっているのか手がかりを持っていないので、それは悪い考えです. このぶら下がっているブール値には何らかの意味があるように見えますが、そうではありません。true を割り当てると false を割り当てるのと同じことを行う場合、これは最小の驚きの原則に違反します。言うまでもなく、「インデックス」として渡す値は、実際には何のインデックスでもありません。合法ですが、意図したものとはまったく異なる方法で構文を使用しています。

正直なところ、 に直接アクセスして既存のメソッドとメソッドList<string>を呼び出すだけのほうがよいでしょう。Contains()Add()

于 2012-12-10T21:15:03.507 に答える
0

読み取り/書き込みプロパティは本質的にgetメソッドとputメソッドであり、そのようなメソッドのペアでは実行できないことは実際には実行できませんが、メソッドがにラップされている場合にのみ、プロパティに関連付けられた構文糖衣を取得できます。 「プロパティ」。メソッドがとることができるフォームにさまざまな制限を課します。特に、プロパティにはset、新しい値を指定するために使用されるパラメーターのタイプのみが異なるこれらのシグニチャーの複数のオーバーロードがない場合があります。またget、戻りタイプがメソッドの「新しい値」パラメーターと一致しないメソッドをset持つ場合もありません。そのパラメータは、の他のすべてのパラメータと正確には一致しませんset

上記の制限を満たすプロパティでのみシンタックスシュガーを使用できるようにすることで何が得られるのか正確にはわかりません。読み取り/書き込みプロパティが単にsetterメソッドと並置されたgetterメソッドである場合、プロパティReadableFooの抽象を持つ抽象型を持ち、をオーバーライドしてを追加する派生型を持つことができます。残念ながら、それは不可能です。最善の方法は、抽象メソッドを呼び出す非仮想読み取り専用プロパティをメソッドに実装させることです。次に、読み取り専用プロパティを読み取り/書き込みプロパティに置き換えながら、前述のメソッドをオーバーライドできます(前述の抽象メソッドにチェーンする必要があります)。getFooMutablefoogetsetReadableFooFooMutableFooget

あなたの特定のシナリオは、あなたが望むことを行うための実行可能な方法のように見えますが、設定a["George"]=false;によってコレクションから「George」を削除することをお勧めします。プロパティセッターに複数のタイプのオーバーロードがあると便利な他の多くのシナリオがありますが、プロパティの設計では許可されていないため、.netに実装することはできません。

于 2012-12-16T21:52:33.097 に答える