- PR -

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

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-10 13:31
引用:

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

typTblに項目をセットしてArrayListにAddする前に typTbl = New stTbl
としたのですが、ことでこの問題を回避できたことになっているんでしょうか?


できれば、別の変数を使いましょう。
バグの温床になりやすいですから。

# C# であれば { } を使って、ブロックをスコープとするローカル変数が作れますが...

引用:

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

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


「式が生成されないので代入できない」というコンパイル エラーになる理由ですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-10 13:41
じゃんぬねっと様、お手数おかけします。

>できれば、別の変数を使いましょう。
承知致しました。

その方向で修正しようと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-10 13:47
補足です。(修正投稿前に投稿されてしまった... orz)

引用:

じゃんぬねっとの書き込み (2006-01-10 13:31) より:

「式が生成されないので代入できない」というコンパイル エラーになる理由ですね。


これを式が生成されるように書くと別物になる、ということが仰りたかったのだと思います。
つまり、先ほどのコードを以下のように分解するとどうなるか考えてみてください。

コード:

    ' DirectCast(ArlTbl(1), stTbl).Code = "3" 
    '                 ↓
    Dim t As stTbl = DirectCast(ArlTbl(1), stTbl)
    t.Code = "3"


元の ArlTbl(1) と t は同じものを指し示しているでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 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"

のままである、という理解なんですが全然自信ありません。^^;

またこういうことを書くとお手を煩わせそうで恐縮です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-10 14:33
引用:

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

Dim t As stTbl = DirectCast(ArlTbl(1), stTbl)
この時点では t.Code = "3" だと思います。


最初の 2 行はコメント部分であって「これを分解したらどうなる?」という意味です。
最初のコード (構造体のままであること) が前提となっています。

引用:

t.Code = "2"
を代入しても

DirectCast(ArlTbl(1), stTbl).Code = "3"
のままである、という理解なんですが全然自信ありません。^^;


試せば結果は判ることですので、自信を持ちましょう。(^^)
構造体は値型ですが、クラスは参照型です。
構造体の場合はどうなって、クラスの場合だとどうなるかを見てください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-10 15:11
じゃんぬねっと様、度々すいません。

>構造体は値型ですが、クラスは参照型です。

先ほどご紹介して頂いたリファレンスにもそのことが
明記されていて、気になっております。^^;

>構造体の場合はどうなって、クラスの場合だとどうなるかを見てください。
はい、慎重に事態の推移を見守りたいと思います。^^

ご指導、ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-11 05:21
 あ、フィールドはそのまま公開なのね。

 この場合、ArrayList.Item プロパティを通しているから、ですね。stTbl のプロパティはそのままアクセスできますが、その上にArrayList をかぶせているので、やっぱりクローンの攻撃のようになっています。ちょうど、「暗黒面はどこにでも存在する」のところです。


引用:

部品をなんとなくクラス化したことはあるのですが、
実は、未だにどのようなモノをクラス化して、
どのようなモノをPublicモジュール化すべきなのかの
住み分けも理解できてない初心者です。


 「Public モジュール」が、「Module ブロック」を指しているなら、使わないでもプログラムは作れます。または、使わないようにするほうが、よりよいでしょう。理由は、変更の影響範囲が大きくなるからです。
 どこでも使えるということは、「どこで使われているかわからない」ということです。どこで使われているかわからないので、おいそれと変更するわけにはいきません。
___________________________________
□ written by Jitta on 2006/01/10
_________________

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