みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

VB.NET2013多次元構造体の初期化について

Visual Studio2013 VB.NETを始めたばかりです
多次元構造体の初期化で困ってました
内容的には
Public Structure ST1
Public a1 As Boolean
Public a2 As Integer
<VBFixedArray((9), (2)), MarshalAs(UnmanagedType.ByValArray, sizeconst:=30)> _
Public a3(,) As Long
Public Sub Initialize()
ReDim a3(9, 2)
End Sub
End Structure
Public ss1(0) as ST!

Public Sub test()
ss1.Initialize()
ss1(0).a3(0,0)=0

この状態では、多次元配列は確保されなくNothingで
初期化できない、参照型であると言うのが分かり
色々と調べてみてやっと、
コピーコンストラクタを用意して複製する方法で出来るのが分かりました

Public Sub New(ByVal ss As ST1)
MyClass.a1 = ss.a1
MyClass.a2 = ss.a2
MyClass.a3 = DirectCast(ss.a3.Clone(), Long(,))
End Sub
End Structure

Public Sub test()
Dim ss0 As ST1
ss0.a1 = True
ss0.a2 = 1
ss0.a3 = New Longr(,) {・・・・}
Dim ss1(0) As New ss0

ただa3のサイズが大きいため定義するのは大変なので
Dim bb(9,2) As Long

ss0.a3 = bb

としても上手く初期化できるのが分かり
そしてステップ実行で中を確認していると
あれっと思い
「コピーコンストラクタを用意して複製」
の方法ではなく元のまま
Public Sub test()
Dim bb(9,2) As Long
ss1.Initialize()
ss1(0).a3=bb
とすると、上手く初期化され
ss1(0).a3(0,1) = 100
と処理できるようになりました

ただ、これで本当にいいのかが分かりません
よろしくお願いします

投稿日時 - 2015-09-02 04:59:26

QNo.9040605

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

多次元構造体なんていう言い方をしていますがオブジェクトです。

オブジェクトの初期化というのは、オブジェクト自体の初期化をするのが正解だし安全です。

つまり、そのオブジェクトを破棄し、同じ名前でクリエイトするだけです。

コンストラクターがちゃんと初期化ステップを記述してあれば、それだけでOKです。
Initializeというような、意味でひきずられたりするコーディングはやめたほうが悩まなくて済みます。

投稿日時 - 2015-09-02 08:57:20

お礼

有り難うございます
還暦過ぎた年寄りには新しい言葉が次から次に出てくるので
覚えるのも理解するのも追いつきません
Initializeは不要だと思ってました

実は、ss1は動的配列として使用しているのですが
a3
の値全てが最後にセットした値と同じになってて悩んでいましたが
回答の内容を元に、色々調べた結果解決しました

投稿日時 - 2015-09-02 18:49:01

あなたにオススメの質問