タイトル | : Re: 構造体型の変数について |
記事No | : 6260 |
投稿日 | : 2007/09/10(Mon) 10:31 |
投稿者 | : 魔界の仮面弁士 |
本題に入る前に、まずは細かい話から。
> Dim FirstName As string アクセス修飾子が省略されて、単に Dim とだけ書かれたフィールド変数というのは、 それが Class 内のものであれば「Private FirstName As String」の意味となり、 それが Structure 内のものであれば、「Public FirstName As String」の意味となります。
このような差異があるため、フィールド変数を Dim のみで宣言するのは、あまり感心しません。 混乱を避けるため、常に Private / Public 等のアクセス修飾子を付けるようにしましょう。
> Retrun FirstName & LastName Retrun ではなく、Return (リターン)です。
さて、ここからが本題。
> Dim pClsObj2 As Person > と新しくインスタンスを「ヒープ」上に作成せずに、2個目のクラス型変数を宣言した場合には、 > pClsObjとpClsObj2は同じインスタンスを参照することになる。 > よって値を変えたりすると互いに影響がある。(これがポインタということでしょうか・・) pClsObj2 ではなく、pClsObj2 のことだと思いますが、そもそもこの時点では、 pClsObj2 には何のインスタンスも割り当てられていません(Nothing 状態)ので、 同一インスタンスを参照することになっているわけではありませんし、 ましてや、値の変更が互いに影響を及ぼしあうようなこともありません。
もし、それぞれの変数に、同じインスタンスを参照させたいのであれば、 pClsObj2 = pClsObj のようにして、同一インスタンスへの参照を持たせるようにする必要があります。
少し定義を変えて説明すると、 Public Class Class1 Public Value As Integer End Class
Public Structure Structure1 Public Value As Integer End Structure という型定義があったとします。この時、 Dim val1, val2 As Structure1 val1.Value = 987 val2 = val1 '値型なので、オブジェクトそのものがコピーされて渡される。 MsgBox(val1.Value) 'この時点では「987」という値である。 val2.Value = 654 'コピー元の内容を書き換えても、コピー先には影響を与えない。 MsgBox(val1.Value) '結果として、「987」のままである。 '----------------------- Dim ref1, ref2 As Class1 ref1 = New Class1() 'インスタンスを生成 ref1.Value = 123 ref2 = ref1 '参照型なので、オブジェクトへの参照がコピーされて渡される。 MsgBox(ref1.Value) 'この時点では「123」という値である。 ref2.Value = 456 '同一インスタンスを参照しているので、ref1 にも影響がある。 MsgBox(ref1.Value) '結果として、「456」という値に書き換わっている。 という動作になるのが、『値型』と『参照型』の最大の違いとなります。
> "さらに、ヒープ上にあるインスタンスには「スタティック」にあるCompNameメソッドとの > 関連付けがなされるようなデータも付加されている" この場合の「スタティック」とは、何を意味した言葉でしょうか? それによって、話の流れが変わってきます。
もし、Visual Basic の「Static キーワード」を意味しているのであれば、それは 「Dim FirstName As String」ではなく『Static FirstName As String』のように 宣言された変数を意味します。しかし、実際にはそうなっていませんよね。
また、Java/C#/J#/JScript/MSIL などでいうとこの「static (静的)メソッド」の意味ならば、 「Dim FirstName As String」ではなく、『Shared Function CompName() As String』のように 宣言された、「Shared (共有)メソッド」のことを指す事になります。 しかし、こちらもそのような宣言にはなっていませんね。
> "構造体は「値型」である。値型の変数は「参照」を格納するのではなく「値」そのものを保持する その認識は正しいです。
> 「New」というキーワードはつけてもつけなくても同じであり「冗長」であるとありました。 そのとおり、この場合は New を付けなくても同じ結果になります。その意味では冗長です。 ただし、「引数付きコンストラクタ」を受ける場合などにおいては、それが構造体であっても、 New が意味を持ってくることになります。
> しかし「構造体型の変数pStrucObjは値型なので「参照ポインタ」ではなく > 値そのものが格納される」ということならば・・・構造体PersonStruct型の変数である > pStrucObj にはいったい何が格納されているのですか?構造体の値とは何でしょうか・・。 何を聞かれているのかが読み取れなかったので、説明にズレがあるかも知れませんが御容赦を。
値型のオブジェクトは、ヒープ上ではなく、アプリケーションのデータセグメントまたは スタック上に割り当てられます。
> 推測ですがもし仮に構造体変数のpStrucObjに、この構造体のメンバ変数である > 「FirstName」や「LastName」の値そのものが格納されているのであれば、 いいえ、そうではありません。
FirstName や LastName が、String 型という「参照型(System.String クラス)」であることに 注意してください。構造体内の String 型メンバは、ヒープ上の特定のポインタとして 格納されるだけであり、構造体そのものの中には格納されません。
|