2009-07-08 14 views
3

私は本当に関数である配列を持っていますが、配列として使用したいと思います。私はこれらを書くことができると知っています[]のように関数を実装する

int var { get{return v2;} } 
public int this[int v] { get { return realArray[v]; } 

しかし、どのように私は配列のような機能を実装するのですか?私は

public int pal[int i] { get { return i*2; } } 

ような何かをしたいと思いますしかし、それは、C#でコンパイルエラー

error CS0650: Bad array declarator: To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type. 
error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) 

答えて

10

を取得し、パラメータ化されたプロパティを宣言するための唯一の可能な方法は、インデクサです。ただし、インデクサを提供するクラスを作成し、あなたのクラスにその型のプロパティを追加することによって、そのようなことをシミュレートすることができます:

class ParameterizedProperty<TProperty, TIndex> { 
    private Func<TIndex, TProperty> getter; 
    private Action<TIndex, TProperty> setter; 
    public ParameterizedProperty(Func<TIndex, TProperty> getter, 
            Action<TIndex, TProperty> setter) { 
     this.getter = getter; 
     this.setter = setter; 
    } 
    public TProperty this[TIndex index] { 
     get { return getter(index); } 
     set { setter(index, value); } 
    } 
} 

class MyType { 
    public MyType() { 
     Prop = new ParameterizedProperty<string, int>(getProp, setProp); 
    } 
    public ParameterizedProperty<string, int> Prop { get; private set; } 
    private string getProp(int index) { 
     // return the stuff 
    } 
    private void setProp(int index, string value) { 
     // set the stuff 
    } 
} 

MyType test = new MyType(); 
test.Prop[0] = "Hello"; 
string x = test.Prop[0]; 

あなたはゲッターを除去することにより、読み取り専用とプロパティのみを記述するためにアイデアを拡張したりすることができます適切なクラスからのセッター。

+0

コード例? –

1

は、あなたがそのようなインデクサーに名前を付けることができない、気づいた、ように、次のいずれか

public int this[int i] { get { return i * 2; } } 

それともは本当にpalそれに名前を付けるに設定されている場合は、代わり:

public class Wrapper 
{ 
    public int this[int i] { get { return i * 2; } } 
} 

... 

public Wrapper pal { get { return _someWrapperInstance; } } 

その後、アクセスすることができますpal[ix]pal[3]など

1

いずれかの配列オブジェクトを返します。

public int[] pal { get { return realArray; } } 

かインデクサーを持つオブジェクトを返します。

public class ActingAsArray { 
    private int[] _arr; 
    public ActingAsArray(int[] arr) { _arr = arr; } 
    public int this[int v] { get { return _arr[v]; } } 
} 

public ActingAsArray pal { get { return new ActingAsArray(realArray); } } 
1

あなたはC#で(overloadable operators)ブラケット演算子をオーバーロードすることはできません。あなたが示したように、あなたができることはindexerを実装することです。ドキュメントごとに、インデクサーを実装するにはthisキーワードを使用する必要があります。インデクサーはプロパティとよく似た働きをします。ゲッターとセッターがあり、ゲッターやセッターのどの機能も実行できます。

0

あなたはVB.Netのビットを使用してもかまわない場合は、それがパラメータのプロパティをサポートしています(.NETが明らかにそれを行うことが可能であるとして、それは、C#でことはできませんなぜまだ私を打つ)

この方法で、あなたあなたのクラスをVB.Netで作成し、あなたのプロジェクトでVB.Net DLLを参照するだけです。

これはもちろん、クラスが頻繁に変更される場合、多少面倒なことがあります。 -/

関連する問題