- - PR -
構造体をArrayListにAddした場合の値の変更について
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-10 13:31
できれば、別の変数を使いましょう。 バグの温床になりやすいですから。 # C# であれば { } を使って、ブロックをスコープとするローカル変数が作れますが...
「式が生成されないので代入できない」というコンパイル エラーになる理由ですね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-01-10 13:41
じゃんぬねっと様、お手数おかけします。
>できれば、別の変数を使いましょう。 承知致しました。 その方向で修正しようと思います。 | ||||||||
|
投稿日時: 2006-01-10 13:47
補足です。(修正投稿前に投稿されてしまった... orz)
これを式が生成されるように書くと別物になる、ということが仰りたかったのだと思います。 つまり、先ほどのコードを以下のように分解するとどうなるか考えてみてください。
元の ArlTbl(1) と t は同じものを指し示しているでしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-01-10 14:14
じゃんぬねっと様、手取り足取り申し訳ありません。
Dim t As stTbl = DirectCast(ArlTbl(1), stTbl) この時点では t.Code = "3" だと思います。 t.Code = "2" を代入しても DirectCast(ArlTbl(1), stTbl).Code = "3" のままである、という理解なんですが全然自信ありません。^^; またこういうことを書くとお手を煩わせそうで恐縮です。 | ||||||||
|
投稿日時: 2006-01-10 14:33
最初の 2 行はコメント部分であって「これを分解したらどうなる?」という意味です。 最初のコード (構造体のままであること) が前提となっています。
試せば結果は判ることですので、自信を持ちましょう。(^^) 構造体は値型ですが、クラスは参照型です。 構造体の場合はどうなって、クラスの場合だとどうなるかを見てください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-01-10 15:11
じゃんぬねっと様、度々すいません。
>構造体は値型ですが、クラスは参照型です。 先ほどご紹介して頂いたリファレンスにもそのことが 明記されていて、気になっております。^^; >構造体の場合はどうなって、クラスの場合だとどうなるかを見てください。 はい、慎重に事態の推移を見守りたいと思います。^^ ご指導、ありがとうございました。 | ||||||||
|
投稿日時: 2006-01-11 05:21
あ、フィールドはそのまま公開なのね。
この場合、ArrayList.Item プロパティを通しているから、ですね。stTbl のプロパティはそのままアクセスできますが、その上にArrayList をかぶせているので、やっぱりクローンの攻撃のようになっています。ちょうど、「暗黒面はどこにでも存在する」のところです。
「Public モジュール」が、「Module ブロック」を指しているなら、使わないでもプログラムは作れます。または、使わないようにするほうが、よりよいでしょう。理由は、変更の影響範囲が大きくなるからです。 どこでも使えるということは、「どこで使われているかわからない」ということです。どこで使われているかわからないので、おいそれと変更するわけにはいきません。 ___________________________________ □ written by Jitta on 2006/01/10 _________________ |
«前のページへ
1|2|3