タイトル : 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 言語のソースを読むぐらいはできますが、書く方はかなり自信無し。(^^; |