3

クラスに 2 つの配列があり、次の方法でそれらにアクセスしようとしています。最初のものは theta で機能しますが、2 番目のものは delta_theta のコンパイルに失敗しました。これを使用せずに2番目の配列を行う正しい方法は何ですか?

エラーの内容: エラー 1 配列宣言子が正しくありません: 管理配列を宣言するには、変数の識別子の前にランク指定子を置きます。固定サイズのバッファ フィールドを宣言するには、フィールド タイプの前に fixed キーワードを使用します。

protected double[] theta = null;
protected double[] delta_theta = null;
public double this[int index] {
        get { return theta[index]; }
        set { theta[index] = value; }
}
public double Delta_Theta[int index]
{
        get { return delta_theta[index]; }
        set { delta_theta[index] = value; }
}
4

3 に答える 3

3

プレーンな C# コードでインデクサーの名前を指定することはできません。また、同じパラメーターの型を持つ複数のインデクサーを作成して、それらを名前で区別することもできません。

使用する他の言語 (名前付きインデクサーをサポートする)の名前を指定できますが、DefaultMemberAttributeその名前を自分で使用することはできません。(COM コンポーネントを除き、C# 4 以降のみ。)

代わりに、関連するインデクサーを公開する何らかの型のプロパティを公開する必要があります。get と set が必要な場合は、配列を読み取り専用プロパティとして、おそらく次のように公開できますIList<double>

// Names changed to be more conventional
public IList<double> DeltaTheta
{
    get { return deltaTheta; }
}

その後、クライアントは引き続き使用できます。

foo.DeltaTheta[10] = 5.5;

例えば。

読み取り専用バージョンの場合、以下を公開できますReadOnlyCollection<double>

public ReadOnlyCollection<double> DeltaTheta
{
    get { return new ReadOnlyCollection<double>(deltaTheta); }
}

または、これを毎回行うのを避けるために、ラッパー用のフィールドを用意することもできます。コンストラクターでフィールドを初期化し、毎回同じラッパー参照を返します。

于 2013-01-25T22:17:10.460 に答える
1

ラッパーインデクサーを作成できます。

protected double[] theta = null;
protected double[] delta_theta = null;

public double this[int index] {
        get { return theta[index]; }
        set { theta[index] = value; }
}

public Indexer DeltaTheta { 
      // can be optimized according to delta_theta lifecycle
      get {return new Indexer(delta_theta);} 
}

// internal indexere wrapper
public class Indexer{
      double [] _data;
      public DoubleIndexer(double[] data ){   
          _data = data;
      }

      public double this[int index] {
            get { return _data[index]; }
            set { _data[index] = value; }
      }
}

次のように使用します。

obj[2]               // -> theta[2]
obj.DeltaTheta[5]    // -> delta_theta[5]
于 2013-01-25T22:28:03.247 に答える
1

同じクラスでそれを行う方法はありません-インデクサーはフォームにある必要がthis(arguments)あるため、同じタイプのインデックスを使用する2つを持つことはできません。

できることは、配列へのインデックス付けをリダイレクトし、Delta_Thetaこのクラスを返すという唯一の目的で内部クラスを作成することです。

public IndexRedirector Delta_Theta 
{ 
  get { return new IndexRedirector { RedirectedArray:delta_theta }; 
}

class IndexRedirector
{ 
  public double[] RedirectedArray;
  public double this[int index] {
    get { return RedirectedArray[index]; }
    set { RedirectedArray[index] = value; }
  }
}
于 2013-01-25T22:16:21.583 に答える