tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: また不明な点が出てきてしまいました・・。
投稿日: 2007/09/11(Tue) 01:39
投稿者魔界の仮面弁士
コメント箇所は、「`」ではなく「'」で記述していただけるとありがたいです。


> Dim aPersonStruct2 As PersonStruct
> aPersonStruct2=aPersonStruct   '構造体は値型なので新しい変数には元の構造体のコピーが設定される
> aPersonStruct2.FirstName ="Ann"
> `変更は元の構造体に反映されない
> Console.WriteLine(aPersonStruct.FirstName)  `⇒John

「クラス」と「構造体」を比較する際に、String 型を使うと
話がややこしくなってしまいます。
# だからこそ先の例では、あえて Integer 型に置き換えたわけですが……。(^^;

String 型は参照型ですが、「生成後はインスタンスの内容を変更できない」仕様で
ある上に、幾らかの最適化が施されている関係上、今回のような実験目的には、
比較が行いにくいからです。


実際の所、String 型の解説には以下のように書かれていますよね。
>> この値は変更できません。
>> String オブジェクトは、作成時点以降に値を変更できないことから、
>>不変 (読み取り専用) と呼ばれます。
http://msdn2.microsoft.com/ja-jp/library/system.string%28VS.80%29.aspx


以上を踏まえた上で:


> 「構造体内の String 型メンバは、ヒープ上の特定のポインタとして格納されるだけである」とありました。
もしメンバが Integer 型であった場合は、構造体そのものの中に格納されていたのですが、
今回のメンバは String 型であったため、構造体とは別の領域にて管理されたわけです。


> aPersonStruct2=aPersonStruct
> という部分で値がコピーされているとあります。
> ということは構造体のメンバであるFirstNameの指し示すアドレスもコピーされるのではないのでしょうか・・・。
コピーされます。というよりは、アドレスのみがコピーされることになり、
アドレスが示す値(インスタンス)はコピーされないという事です。
# インスタンスが 2 つできるのではなく、1 つのインスタンスが
# 2 箇所から参照される事になるという意味です。

実際、
> aPersonStruct2=aPersonStruct
を実行後に下記を試してみると、いずれも「True」を示す事から、
FirstName フィールドが、同一インスタンスを参照している事を確認することができます。
 MsgBox(aPersonStruct.FirstName Is aPersonStruct2.FirstName)
 MsgBox(ReferenceEquals(aPersonStruct.FirstName, aPersonStruct2.FirstName))


> aPersonStruct2.FirstName ="Ann"とすると
> FirstNameの参照先は互いに”Ann"になるのではないのでしょうか・・?
なりません。先に書いたように、String 型は変更できないという点に注意してください。

上記は、『FirstName が参照しているインスタンスの値を書き変えている』のではなく、
『FirstName に、新たに "Ann" というインスタンスを代入しなおしている』のです。


> それとも文字列の場合は何か特殊なことがあるのでしょうか・・・

FirstName という String 型のメンバに対して "Ann" を代入するという行為を、
先の No.6260 で例示した Class1 という参照型で言い換えるなら、
 val1.Value = 123     'val1 が参照しているインスタンスの値を 123 に設定
 val1.Value = 654     'val1 が参照しているインスタンスの値を 654 に変更
という処理を行っているのではなく、
 val1 = New Class1()  '新たなインスタンスを生成し、それを参照させている
 val1 = New Class1()  '別のインスタンスを再生成し、それを参照させている
という動作を行っている事になります。


> C言語などを勉強したほうがよいのでしょうか?
多数の言語を知っておくと、各言語の特徴が見えてくるでしょうし、他の言語を
併せて学ぶ事は良い事だと思います。ですが、VB の勉強に C言語が必要という
わけではありません。実際、私は C を勉強していませんしね。

# C 言語のソースを読むぐらいはできますが、書く方はかなり自信無し。(^^;

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。