- PR -

構造体をArrayListにAddした場合の値の変更について

投稿者投稿内容
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-09 23:16
じゃんぬねっと様、リファレンスのご紹介ありがとうございました。

>構造体の変数宣言では初期化子、New キーワード、
または配列の初期サイズを指定できませんが、
クラスの変数宣言では指定できます。

とか

>構造体変数には、構造体のパラメータなしコンストラクタを使って、
メンバの初期化が暗黙的に含まれます。

など、恥ずかしながら初めて目にする…
目からウロコの事実が次々と露に!^^;

非常に有益な情報をどうもありがとうございました。
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-10 10:42
お世話さまです。

構造体の中のArrayListはStringCollectionに書き換えることで
配列の中の特定のStringCollectionは変更することができたのですが、
ArrayListの中の特定箇所はダイレクトに変更できないのでしょうか?

今回の例で行きますと、ArrayListのCodeの部分に当ります。

ArlTblのn番目のCodeを書き換えたいのです。

DirectCast(ArlTbl(1), stTbl).Code = "3"
のように書くと
『Expressionは値であるため、代入式のターゲットにすることはできません。』
というメッセージが出ます。

また、

ArlTbl(1).Code = "3"
のように書くと
『Option Strict Onでは遅延バインディングを使用できません。』
というメッセージが出ます。

今回の例はCodeと複数のNameだけなので、n番目のArrayListを
構造体にセットしてからn番目を削除してn番目に挿入する
ようにしてもまだ我慢できるのですが、構造体の変数が多い場合に
書き換えない変数までいちいち全てをセットし直すのが
バカバカしく思えます。

何かよい方法はないでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-10 10:53
Structure から Class にしてみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-10 11:00
じゃんぬねっと様、早速のレスありがとうございます。

構造体のClass化にトライしてみようと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-10 11:14
引用:

moondogさんの書き込み (2006-01-10 11:00) より:

構造体のClass化にトライしてみようと思います。


その場合、typTbl が同一になってしまうことに注意してください。
現在のコードだとその罠に陥りやすいです。

それができましたら、ArrayList の代わりに独自のコレクション型に拡張してみてください。
そうすれば、DirectCast も不要になります。(さらに強く型を意識することができます)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-01-10 11:24
構造体をObject型として扱う場合は、暗黙の内にボックス化という処理がされています。
ボックス化されたオブジェクトを元の構造体として扱う場合はボックス化解除の処理をしなければなりません。これも型変換の時に暗黙に処理されます。

ArrayListに構造体を入れた時にボックス化、取り出してstTbl型に型変換した時にボックス化解除がされています。

ボックス化やボックス化解除がされた後のオブジェクトは、その元のオブジェクトとは別のオブジェクトです。(ボックス化の動作を考えれば当たり前ですね)
つまり、ArrayListから取り出してstTbl型として参照したオブジェクトはArrayListに格納されているオブジェクトとは別物ということです。その値を変えてもArrayList内のオブジェクトには無関係です。
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-10 12:58
じゃんぬねっと様、度重なるアドバイスありがとうございます。

早速、Class化してみました。

>その場合、typTbl が同一になってしまうことに注意してください。
typTblに項目をセットしてArrayListにAddする前に

typTbl = New stTbl

としたのですが、ことでこの問題を回避できたことになって
いるんでしょうか?

それとも、もっと恐ろしい罠が待っているのでしょうか?^^;
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-10 13:03
一郎様、レスありがとうございます。

うーむ、未熟者のワタクシには今ひとつ内容が理解できません。orz

実装が完了した後に、変更処理の直後にDebug文を入れて
自分の意図した通りにArrayListの当該箇所が変更されて
いるか否かのチェックを徹底したいと思います。

スキルアップ/キャリアアップ(JOB@IT)