- ベストアンサー
C#で構造体の配列を持った構造体を使いたいのですが
C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
C# では、配列は「単なる連続したメモリ領域」ではなくて「添字によってオブジェクトを格納できるオブジェクト」であることに注意しなくてはいけません。つまり、C では配列は一種の構造体でしたが、C# では配列は参照型のオブジェクトです。 よって、C のように予めサイズを固定しておくということは基本的にできません。配列の大きさは配列のインスタンスが作られるときに動的に決まります。 C# では、参照型のオブジェクトを構造体のメンバにすることはあまりありません。null 値の扱いが面倒だからです。 また、C# では構造体の大きさは大きくとも 20 バイト程度までにします。C# では基本的に「構造体へのポインタ」はありません。巨大な構造体をそのまま扱うのはメモリの使い方の観点からいって非効率的です。 今回の件では、構造体ではなくクラスにするのがよいかと思われます。
その他の回答 (3)
- UKY
- ベストアンサー率50% (604/1207)
> この場合もやはり 予めサイズを固定できず インスタンスを動的に生成するようにするわけですよね? クラスにした方が良いのは回答の後半部の理由があるという事でよろしいのでしょうか? はい、そういうことです
お礼
大変参考になりました ありがとうございました
- osamuy
- ベストアンサー率42% (1231/2878)
C#の勉強のつもりで書いてみましたが、あんまり美しくなかったり: public struct Xyz { public struct Abc { public int a, b, c; }; public int index; public Abc[] _abc; }; class Program { static void Main( string[] args ) { Xyz[] _xyz = new Xyz[8]; for ( int i = 0; i < _xyz.Length; i++ ) { _xyz[i]._abc = new Xyz.Abc[32]; } _xyz[0]._abc[3].b = 1; } } C#の構造体は、クラスと違って値型なので、new[]した時点でインスタンス化されるけど、その際、引数なしのコンストラクタを構造体は定義できないので、結局、各要素ごとにインスタンス化しないといけないみたい。 いったん作成したものを捨てるのは忍びないので、代入にしてみてみたけど、中身が露呈しているのがなんとも。
お礼
大変 参考になりました 同じことは すんなりとは 出来ないようですね ありがとうございました
- ko_kinta
- ベストアンサー率39% (43/109)
構造体を宣言している順番はここに書いてある通りですか? struct abcはstruct xyzより前で宣言しなければいけませんよ。 このエラーはstruct xyzのメンバーの型であるabcが見つからないと警告しているのではないですか?
お礼
例えのコードを きちんとチェックしてませんでした ご指摘ありがとうございました
補足
構造体を宣言している順番ですが実際は逆です このコードは 質問を分かりやすくするために いいかげん書いたコードで 最後に順序は入れ換えるのを忘れてました 申し訳ありません 今回の問題はそれとは無関係のようです
補足
回答ありがとうございます クラスを用いるようにした場合 クラスがクラスの配列を持つようにしたいわけですが この場合もやはり 予めサイズを固定できず インスタンスを動的に生成するようにするわけですよね? クラスにした方が良いのは回答の後半部の理由があるという事でよろしいのでしょうか? 重ねて質問申し訳ありません