tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB2005の'New'について
記事No4499
投稿日: 2006/11/06(Mon) 16:11
投稿者form・Z
既出であればご容赦いただければと思います。
VB2005のコードに関連した質問です。

例えばクラス'MyClass1'のメンバとしてクラス配列を
Public Class_Array1() As MyClass2
のように定義し、一定の処理を経て、
Class_Array1(i) = Class_Array1(j) '(i <> j)
に等価な処理が行なわれたとします。

このとき、Class_Array1(i) と Class_Array1(j)
は同じターゲットを参照するはずですが、この段階から
Class_Array1(i) と Class_Array1(j)の参照先を別々にする場合は通常、
Dim Class_Array_Work as New MyClass2
Class_Array1(j) = Class_Array_Work
とすれば、一般にはClass_Array1(i) と Class_Array1(j)は別々の参照を
持つはずです。(ここが間違っているのでしょうか?)

ところが、私の環境でテストしたところでは、MyClass2がメンバとして
例えば'Number'なる整数型データを持つとして、

Dim Class_Array_Work as New MyClass2
Class_Array1(j) = Class_Array_Work
Class_Array1(j).Number = 1

とすると、Class_Array1(i).Numberも同じ値に変更されてしまったのに対し、

Dim Class_Array_Work as New MyClass2
Class_Array_Work.Number = 1
Class_Array1(j) = Class_Array_Work

とすると、Class_Array1(i).Numberは元の値を保持し、Class_Array1(i) と
Class_Array1(j)はそれぞれが個別の参照を持っているようです。

これは、言語仕様なのでしょうか?
Newステートメントについて、私の理解が間違っているかもしれないのですが、
どのようなことなのか教えていただければと思います。

よろしくお願い申し上げます。

[ツリー表示へ]
タイトルRe: VB2005の'New'について
記事No4500
投稿日: 2006/11/06(Mon) 16:53
投稿者魔界の仮面弁士
> Class_Array1(i) = Class_Array1(j) '(i <> j)
> に等価な処理が行なわれたとします。
この = は、(比較式のイコールではなく)代入式のイコールなのですね。

> とすれば、一般にはClass_Array1(i) と Class_Array1(j)は別々の参照を
> 持つはずです。(ここが間違っているのでしょうか?)
裏のコードが見えないので、確実にそうだとは保証できませんが、
一般的には別の参照となるでしょうね。

実際、同じオブジェクトの参照であるかどうかを、If 文等で調査されたかと
思いますが、その結果はどうでしたか?

> ところが、私の環境でテストしたところでは、
問題を再現可能な「最小限のコード」を示してもらえませんか?
もしかしたら、テストコードに問題があるのかも知れませんし。

> これは、言語仕様なのでしょうか?
個人的な予想では、「うっかり Shared メンバを使ってました…」というオチな気がします。

[ツリー表示へ]
タイトルRe^2: VB2005の'New'について
記事No4507
投稿日: 2006/11/07(Tue) 09:58
投稿者form・Z
> > Class_Array1(i) = Class_Array1(j) '(i <> j)
> > に等価な処理が行なわれたとします。
> この = は、(比較式のイコールではなく)代入式のイコールなのですね。
>
> > とすれば、一般にはClass_Array1(i) と Class_Array1(j)は別々の参照を
> > 持つはずです。(ここが間違っているのでしょうか?)
> 裏のコードが見えないので、確実にそうだとは保証できませんが、
> 一般的には別の参照となるでしょうね。
>
> 実際、同じオブジェクトの参照であるかどうかを、If 文等で調査されたかと
> 思いますが、その結果はどうでしたか?
>
> > ところが、私の環境でテストしたところでは、
> 問題を再現可能な「最小限のコード」を示してもらえませんか?
> もしかしたら、テストコードに問題があるのかも知れませんし。
>
> > これは、言語仕様なのでしょうか?
> 個人的な予想では、「うっかり Shared メンバを使ってました…」というオチな気がします。

この問題ですが、どうもマシンのメモリの問題のようで、マシンの起動直後
の作業では本来的な動作を見せているようです。
昨日のうちに回答したかったところですが、開発途中のコードが何度かバグを
起こしているうちに、マシン自体が不安定になって生じた動作かもしれません。

コードをまとめますと、

Class_Array(i) = Class_Array(j)
Msgbox(Object.ReferenceEquals(Class_Array(i), Class_Array(j)))'-(1)
Dim Class_Array_Work As New MyClass2
Class_Array(i) = Class_Array_Work
Msgbox(Object.ReferenceEquals(Class_Array(i), Class_Array(j)))'-(2)

とすると、Msgbox-(1)は"True"を表示、Msgbox-(2)は"False"を表示しました。

この段階からClass_Array(i).Numberの値を変更しても、Class_Array(j).Number
は別個の値を持っていたことから、インスタンスは別々に確保されて様です。

お騒がせいたしました。
ご回答いただきまして、ありがとうございました。

[ツリー表示へ]