2

C ++

typedef struct someStruct {
   int val1, val2;
   double val3;
} someStruct;

someStruct a [1000] = { {0, 0, 0.0}, {1, 1, 1.0}, ... };

私が知っているC#でそのようなテーブルを初期化する唯一の方法は、次のようなものを書くことです。

class SomeStruct 
{
   int val1, val2;
   double val3;

   public SomeStruct (int val1, int val2, double val3)
   {
      this.val1 = val1;
      this.val2 = val2;
      this.val3 = val3;
   }
}

SomeStruct[] a = new SomeStruct [1000] 
{ 
   new SomeStruct (0, 0, 0.0), 
   new SomeStruct (1, 1, 1.0), 
   ... 
};

それらへのポインタの代わりに、型クラスSomeClassの値の配列(への参照)を持つ方法はありますか?

編集:

重要なのは、配列内の構造体ごとにnewを呼び出さなくてもよいということです。したがって、必要なのは、(1000)構造体への1000ポインターではなく、1000構造体を含む配列です。私が尋ねている理由は、C#がこれを処理する方法は、私にはめちゃくちゃ非効率に見え、多くのメモリとメモリ管理のオーバーヘッド(C ++など)を伴うためです。

私は次のようなことを試みました

struct SomeStruct {
   int a, b;
   double c;
   }

SomeStruct[] a = new SomeStruct [1000] { {0,0,0.0}, {1,1,1.0}, ... };

しかし、それは不可能でした。したがって、構造体は値型であることはわかっていますが、これは関数にパラメーターとして渡す場合にのみ当てはまると結論付け、次のように(ここで構造体を使用して)newを使用する必要がありました。

struct SomeStruct {
   int a, b;
   double c;
   SomeStruct (int a, int b, double c) {
      this.a = a; this.b = b; this.c = c;
      }
   }

SomeStruct[] a = new SomeStruct [1000] { 
   new SomeStruct {0,0,0.0}, 
   new SomeStruct {1,1,1.0}, 
   ... 
   };
4

3 に答える 3

2

C#ではstructキーワードを使用できます。C#構造体は値型です。構造体の配列は、C ++標準配列と同じように、連続して格納された構造体です。

于 2010-09-01T13:38:01.180 に答える
0

struct醜いですが、これは機能します(タイプをではなくに変更した場合class

SomeStruct[] a = new SomeStruct [1000];
a[0].val1 = 0;
a[0].val2 = 1;
a[0].val3 = 2.0;
...
a[999].val1 = 0;
a[999].val2 = 1;
a[999].val3 = 2.0;

編集:

これがグローバルフィールドの場合は、として宣言astatic readonlyます。

于 2010-09-01T13:42:24.153 に答える
0

これを行うには、SomeStructの新しいコレクション(から派生IEnumerable<>)を作成します。初期化構文で使用する各アイテムは、の呼び出しに変換される.Add(...)ため、コレクションクラスにAddというメソッドがある場合(他から継承する必要はありません)。このためのインターフェイス)、一致する引数を使用して、同じC++構文を使用できます。

例えば。

public class SomeStructCollection : IEnumerable<SomeStruct> {
    private readonly SomeStruct[] someStructs = new SomeStruct[1000];
    private int currentIndex;

    public void Add(int val1, int val2, double val3) {
        someStructs[currentIndex++] = new SomeStruct(val1, val2, val3);
    }

    public SomeStruct this[int index] {
        get { return someStructs[index];
    }

    //Implement IEnumerable<> interface.
}

呼び出し元のコードは、いくつかのブロックで値をラップできます

SomeStructCollection coll = new SomeStructCollection {
    {0, 0, 0.0}, {1, 1, 1.0}, { ... },
};
于 2010-09-01T13:54:05.120 に答える