- - PR -
構造体をArrayListにAddした場合の値の変更について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-01-09 23:16
じゃんぬねっと様、リファレンスのご紹介ありがとうございました。
>構造体の変数宣言では初期化子、New キーワード、 または配列の初期サイズを指定できませんが、 クラスの変数宣言では指定できます。 とか >構造体変数には、構造体のパラメータなしコンストラクタを使って、 メンバの初期化が暗黙的に含まれます。 など、恥ずかしながら初めて目にする… 目からウロコの事実が次々と露に!^^; 非常に有益な情報をどうもありがとうございました。 | ||||
|
投稿日時: 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番目に挿入する ようにしてもまだ我慢できるのですが、構造体の変数が多い場合に 書き換えない変数までいちいち全てをセットし直すのが バカバカしく思えます。 何かよい方法はないでしょうか? | ||||
|
投稿日時: 2006-01-10 10:53
Structure から Class にしてみてください。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-01-10 11:00
じゃんぬねっと様、早速のレスありがとうございます。
構造体のClass化にトライしてみようと思います。 | ||||
|
投稿日時: 2006-01-10 11:14
その場合、typTbl が同一になってしまうことに注意してください。 現在のコードだとその罠に陥りやすいです。 それができましたら、ArrayList の代わりに独自のコレクション型に拡張してみてください。 そうすれば、DirectCast も不要になります。(さらに強く型を意識することができます) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-01-10 11:24
構造体をObject型として扱う場合は、暗黙の内にボックス化という処理がされています。
ボックス化されたオブジェクトを元の構造体として扱う場合はボックス化解除の処理をしなければなりません。これも型変換の時に暗黙に処理されます。 ArrayListに構造体を入れた時にボックス化、取り出してstTbl型に型変換した時にボックス化解除がされています。 ボックス化やボックス化解除がされた後のオブジェクトは、その元のオブジェクトとは別のオブジェクトです。(ボックス化の動作を考えれば当たり前ですね) つまり、ArrayListから取り出してstTbl型として参照したオブジェクトはArrayListに格納されているオブジェクトとは別物ということです。その値を変えてもArrayList内のオブジェクトには無関係です。 | ||||
|
投稿日時: 2006-01-10 12:58
じゃんぬねっと様、度重なるアドバイスありがとうございます。
早速、Class化してみました。 >その場合、typTbl が同一になってしまうことに注意してください。 typTblに項目をセットしてArrayListにAddする前に typTbl = New stTbl としたのですが、ことでこの問題を回避できたことになって いるんでしょうか? それとも、もっと恐ろしい罠が待っているのでしょうか?^^; | ||||
|
投稿日時: 2006-01-10 13:03
一郎様、レスありがとうございます。
うーむ、未熟者のワタクシには今ひとつ内容が理解できません。orz 実装が完了した後に、変更処理の直後にDebug文を入れて 自分の意図した通りにArrayListの当該箇所が変更されて いるか否かのチェックを徹底したいと思います。 |