2011-05-22 14 views
16

私は以前どこかで見たことがあると思いますが、今は覚えていませんが、引数でゲッタープロパティを作成する方法はありますか?引数を指定したGetterプロパティ

私は「float getSize();」を変換できるので、 "浮動小数点サイズ"

float getSize() { 
    return this.size; 
} 

float Size { 
    get { return this.size; } 
} 

次に、たとえば「float getSize(String unit);」と変換できますか? "float Size(String unit)"とかそういうもの?

float getSize(String unit) { 
    return this.size; 
} 

float Size(String unit) { 
    get { 
     if (unit == Unit.Meters) 
      return this.size/100; 
     else 
      return this.size; 
    } 
} 

私は全く機能を使用してのない、本当に問題はありませんと思うが、より良い、このようになります:P

+7

ゲッターが引数を取った場合、メソッド呼び出しと全く同じように見えませんか? – BoltClock

+3

@BoltClock:はい、そうです。彼らはとにかくボンネットのメソッド呼び出しとして実装されています。そして、VB.NET *はgetterを任意のパラメータで定義できるようにします。 –

答えて

24

質問に答えるために:いいえ、それは不可能である、とは既に指摘パラメータを持つgetterはメソッドのように見えます。

あなたが考えている事は、このようになります。これは、インデックス付きのデフォルトプロパティであるかもしれない:

class Test 
{ 
    public string this[int index] 
    { 
     get { return index.ToString(); } 
    } 
} 

これは、あなたがこのように、テストのインスタンスにインデックスすることができます:

Test t = new Test(); 
string value = t[1]; 
+0

ありがとう、私はそれが可能ではないことを恐れていた。しかし、名前が言うように、私はオブジェクトに関連するプロパティやパラメータを取得するためにプロパティを保持しようとします。また、他のものを操作して計算するメソッドもあります。D – Dane411

+3

@ Dane411:実際にプライベートフィールドの値を返すだけでなく高価な操作を実行するゲッター(ファイルからのデータの読み込みなど)を使用することをお勧めします。またはパラメータを取る必要のあるものは、通常の方法で実装する必要があります。それらに 'GetXXX()'と名前をつけてみましょう。誰もあなたのコードをうまく理解するでしょう。 –

+0

ありがとうコーディー、私がしたことthats。しかし、それは高価ではありませんでしたが、配列から項目を取得...だから私はもう少しのために、とdriisは言ったように、私はメソッドが安いにもかかわらず、インデックスされたプロパティを持つ内部クラスでaproachを達成リソースで):) – Dane411

13

しかしちょうど好奇心として... VB .Netでパラメータを持つプロパティが可能です

次のようになります:

Public ReadOnly Property oPair(param As String) As Result 
    Get 
     'some code depends on param 
    End Get 
    End Property 

通常の機能よりもうまく機能しませんが、そのような可能性があることは時折ありがたいです。

0

クラスオブジェクトは、クラスオブジェクトへのプライベートリファレンスを保持するだけのプロパティを返すようにすることで、名前付きインデックス付きプロパティゲッターとして動作するものを合理的に効率的に持つことができます。クラス内のメソッドに渡します。このような単一項目構造は、基本的に無償で生成することができます(レジスタに収まる可能性があり、別のレジスタに値がロードされることがあります; JITは同じレジスタを使用できることを認識することさえできます両方の目的)ので、このようなゲッターを使用するとコードをより読みやすくして、実質的な議論に有利にします。

残念なことに、構造体メンバが下位の構造体を変更するかどうかを示すことができないため、同じ方法をインデックス付きのプロパティセッタに使用することは不可能です。それはそれ1が持っている可能性があり、参考になるにもかかわらずのようなものでOrderedCollection<T>を持っている:

struct ByIndexAccessor { 
    OrderedCollection<T> owner; 
    ByIndexAccessor(OrderedCollection<T> o) { owner = o; } 

    T this[int index] { 
    get { return owner.handleGet(index); } 
    set { owner.handleSet(index, value); } 
    } 
} 
ByIndexAccessor ByIndex { 
    get {return new ByIndexAccessor(this); } 
} 

myCollection.ByIndex[3] = newThing;を言うことは、この特定のset実装が安全に使用できるインデックスを作成することを知る方法がないので、C#が、そのようなコードを拒否する読み取り専用構造上にある。

関連する問題