DOBON.NET DOBON.NETプログラミング掲示板過去ログ

初期値を持った構造体の作成

環境/言語:[C#.NET]
分類:[.NET]

こんにちは。初めまして。
超初心者のもぐすけです。
早速ですが

struct data
{
    public string strHoge;
    public int intHoge;
    public double dblHoge;
}

data[] d = new data[3];

たとえばこんな宣言があったとして
この構造体に初期値を設定したいのですが

d[0].strHoge = "ABC";
d[0].intHoge = 1;
d[0].dblHoge = 0.5;
d[1].strHoge = "DEF";
d[1].intHoge = 4;
・・
・・
・・

こんなかんじでいちいち列記するしかないのでしょうか?
配列数が少なければそれでもいいのですが、
10も20もの宣言のあとではゲッソリです。
簡単な書き方があれば教えて欲しいのですが。
宜しくお願いいたします。
.NET Frameworkでは構造体にもコンストラクタを使用できるので、
struct data
{
public data(string value1,int value2,double value3)
{
this.strHoge = value1;
this.intHoge = value2;
this.dblHoge = value3;
}

public data(string value1,int value2)
{
this.strHoge = value1;
this.intHoge = value2;
this.dblHoge = 0;
}

public data(string value1)
{
this.strHoge = value1;
this.intHoge = 0;
this.dblHoge = 0;
}

public string strHoge;
public int intHoge;
public double dblHoge;
}

data[] d = new data[4];

// 引数を利用してフィールドを初期化
d[0] = new data("ABC",1,0.5);
d[1] = new data("DEF",2);
d[2] = new data("DEF");

// 構造体は暗黙的に引数をとらないコンストラクタを持ち、
// この場合、フィールドはすべて各型の既定値かnullで初期化されます
d[3] = new data();

と記述することができます。
また、

data[] d = new data[4];

という文は配列を作成するだけで各構造体のコンストラクタは呼び出されません。
クラスなどの参照型とは異なり、使用することはできますがフィールドに入る値は未定になるので各要素にそれぞれnewで初期化することが推奨されます。
この二つの手順をまとめて、

// リストで指定された数の配列を作成する
data[] d = new data[]
{
new data("ABC",1,0.5),
new data("DEF",2,1.5),
new data("DEF"),
new data(),
};

と記述することもできます。
■No3775に返信(もぐすけさんの記事)
はじめまして。ゆかりです。

私も前に同じことで悩みました。
職場の先輩にはこんなやり方を教わりました。
その先輩もC#はあまり経験がないので、最善ではないかもしれない
とはおっしゃってましたけど・・・・

まず、structの宣言にコンストラクタを追加します。

public data( string strHoge, int intHoge, double dblHoge )
{
this.strHoge = strHoge;
this.intHoge = intHoge;
this.dblHoge = dblHoge;
}

そうすると普通に一個だけ初期化するなら

data d = new data( "hoge1", 1, 1.1 );

と、書けるし、配列でも、

data[] d = new data[3] {
new data( "hoge1", 1, 1.1 ),
new data( "hoge2", 2, 2.2 ),
new data( "hoge3", 3, 3.3 ),
};

と、書くことが出来るようになります。

肝心なのは、初期化をするためにはコンストラクタが必要ということだと
思うのですが、もっと簡単に(C言語の配列みたいに)書く方法があると
便利だと思うんですけどね。
こんにちは
お返事ありがとうございます。

ムム!コンストラクタですか・・・きいたことはあるけど・・
今、いただいたレシピを何とか使いこなそうと悪戦苦闘しております。
なにせよくわかっていないものですから(^^;)
まだ時間がかかりそうですので
ご報告は改めてさせていただきたいと思います。

なにはともあれ
Codingslaveさん、ゆかりさん。お二方にはお礼を申し上げます。
ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板