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

構造体の中の構造体について

環境/言語:[環境:WinVista VB.NET 2005 framewrok2.0]
分類:[.NET]

こんにちは。

構造体(Structure)の扱いについての相談です。

構造体Aのバックアップ用として構造体Bを作成しようとしています。
(構造体Aが変更された気に構造体Bをコピーして初期化しようと思っています)

構造体中にさらに構造体を宣言しているのですが、
このさらに宣言している構造体の値を変更しようとすると
構造体Bの値も変更されてしまいます。

扱い方に問題があると思うのですが、回避方法がわかりません。
よろしくお願いします。

環境:WinVista VB.NET 2005 framewrok2.0

------------------------------------------------
Public Class Form1

'構造体 親
Private Structure stTEST_A
Dim TEST_A As String
Dim TEST_A2() As stTEST_A_A
End Structure
'構造体 子
Private Structure stTEST_A_A
Dim TEST_A_A As String
End Structure

' メイン
Private testA As stTEST_A
' バックアップ用
Private testB As stTEST_A

' FORM_LOAD
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
testA.TEST_A = "TEST_A"
ReDim testA.TEST_A2(1)
testA.TEST_A2(0).TEST_A_A = "AA"

testB = testA
End Sub

'変更イベント(とりあえずボタンクリックで)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
testA.TEST_A = "TEST_A_A" ' testB.TEST_A には影響なし
testA.TEST_A2(0).TEST_A_A = "BBBBBBB" ' testB.TEST_A2(0).TEST_A_A にも"BBBBBBB"がセットされる
End Sub

End Class
■No28554に返信(みけんにしわさんの記事)
> 構造体中にさらに構造体を宣言しているのですが、
> このさらに宣言している構造体の値を変更しようとすると
> 構造体Bの値も変更されてしまいます。

構造体は値型で、代入するだけでコピーになります。
配列は参照型で、代入するだけでは同じものを参照することになります。

構造体の配列も、配列の一つのケースに過ぎませんので、参照型です。


> 扱い方に問題があると思うのですが、回避方法がわかりません。

ディープコピーで検索すれば見えてくるかもしれませんね。
(要するに単に代入するだけでなく、配列(参照型)を新たに確保し直して、配列(参照型)の中身を逐次コピーしなければならない)
返信ありがとうございます。

なるほど、構造体だからというわけではなかったのですね。

コピー用のメソッドを自分で作成して対応したいと思います。

ありがとうございました。



■No28555に返信(Azuleanさんの記事)
> ■No28554に返信(みけんにしわさんの記事)
>>構造体中にさらに構造体を宣言しているのですが、
>>このさらに宣言している構造体の値を変更しようとすると
>>構造体Bの値も変更されてしまいます。
>
> 構造体は値型で、代入するだけでコピーになります。
> 配列は参照型で、代入するだけでは同じものを参照することになります。
>
> 構造体の配列も、配列の一つのケースに過ぎませんので、参照型です。
>
>
>>扱い方に問題があると思うのですが、回避方法がわかりません。
>
> ディープコピーで検索すれば見えてくるかもしれませんね。
> (要するに単に代入するだけでなく、配列(参照型)を新たに確保し直して、配列(参照型)の中身を逐次コピーしなければならない)
>
解決済み!

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