C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■83898 / )  Re[1]: 構造体の入れ子
□投稿者/ 魔界の仮面弁士 (1265回)-(2017/04/21(Fri) 10:21:16)
2017/04/21(Fri) 10:26:25 編集(投稿者)

No83897 (Oboe2001 さん) に返信
> VB6までは、Typeで宣言すれば入れ子構造を作ることができました。VB.NET以降では
> TypeではなくStructureやClassを使えば良さそうだ、ということまでは分かりました。

VB4〜VB6 でも、クラスの入れ子はできますね。
Class ステートメントではなく、*.cls ファイルでの宣言になりますが。


> しかしながら、「食材」のところで、「BC30053 配列を'New'で宣言することはできま
> せん」と怒られてしまいます。

要素数を指定して宣言すれば、それだけで配列のインスタンスが生成されますので、
New を使う必要が無いという事です。下記の 4 つはいずれも同じ意味です。


★案1★
Public Class Cls_Food
 Public Fruit(1) As Cls_Fruit
 Public Vegitable(1) As Cls_Vegitable
End Class


★案2★
Public Class Cls_Food
 Public Fruit() As Cls_Fruit
 Public Vegitable() As Cls_Vegitable
 Public Sub New()
  ReDim Fruit(1), Vegitable(1)
 End Sub
End Class

★案3★
Public Class Cls_Food
 Public Fruit() As Cls_Fruit = New Cls_Fruit() {Nothing, Nothing}
 Public Vegitable() As Cls_Vegitable = New Cls_Vegitable() {Nothing, Nothing}
End Class

★案4★
Public Class Cls_Food
 Public Fruit() As Cls_Fruit = New Cls_Fruit(1) {}
 Public Vegitable() As Cls_Vegitable = New Cls_Vegitable(1) {}
End Class


> Food.Fruit(1).Apple(7) = 100 ……のような使い方をしたいのですが、
Cls_Fruit が、VB.NET の「構造体(Strucutre)」や VB6 の「ユーザー定義型(Type)」ではなく、
Cls_Fruit が、VB.NET の「クラス(Class)」や VB6 の「クラス」として宣言されていた場合、
単に配列を確保しただけでは、個々の要素の初期値は Nothing になっています。

ですからクラスの配列であった場合には、VB6 でいうところの
 ReDim Food.Fruit(1)
 Set Food.Fruit(0) = New Cls_Fruit
 Set Food.Fruit(1) = New Cls_Fruit
のような処理が事前に必要です。


配列要素の初期化も併せて行うならこんな感じ。
今回は 0 To 1 な 2 要素な配列だけなので、直接書いてみます。

★案5★
Public Class Cls_Food
 Public Fruit() As Cls_Fruit = {New Cls_Fruit(), New Cls_Fruit()}
 Public Vegitable() As Cls_Vegitable = {New Cls_Vegitable(), New Cls_Vegitable()}
End Class

配列の要素数が多い場合は、初期化処理をコンストラクタ内で
ループ生成した方が良いでしょう。
返信 編集キー/


管理者用

- Child Tree -