構造体とクラスについて への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 るしぇ  (社会人) 投稿日時 2010/3/12 20:09:53
毎度おなじみ
[Visual Basic 中学校 > 初級講座 > 第34回 値型と参照型]
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard34.htm

[独学C# > C#プログラミング応用講義 > 構造体]
http://www12.plala.or.jp/dokugaku/lecture/6/4.html

もともと参照型は、大きなデータを丸ごと移動させる処理時間を改善する
ために考えられた仕組みです。
メモリ上の実体は動かさず、その位置情報(アドレス)をやり取りします。
葉書に書く住所(アドレス)みたいなものです。「東京都杉並区」と書いた
葉書をコピーしても、実際の「東京都杉並区」は動かないし、「東京都杉並区」
に建てた家を改築したら、葉書に書いた住所で訪ねた家も、コピーした住所で
訪ねた家も改築されていることと思われます。

これを葉書をコピーした時点で、「東京都杉並区」丸ごとコピーして別の
場所に再現してしまうのが「構造体」であり、「値型」の動きです。
このとき、実際は「東京都杉並区」から「コピー世界東京都杉並区」に住所が
変わってます。メモリ上で2箇所に「東京都杉並区」ができるので、それぞれの
場所で違う値を記憶しておけます。
投稿者 tecc  (社会人) 投稿日時 2010/3/12 19:57:21
値型を参照型ってそういう事でしたか。
ありがとうございました・・。
投稿者 ?-?  (その他) 投稿日時 2010/3/12 19:45:40
> mc2 の中に mc1 があり

え?
ちゃうよ?
mc2=mc1で、コピーというより、「mc2はmc1のメモリ配置と同じ場所ですよ」とやっちゃったからじゃないの?
投稿者 tecc  (社会人) 投稿日時 2010/3/12 19:31:09
環境忘れました。
C#
コンソールアプリケーション
投稿者 tecc  (社会人) 投稿日時 2010/3/12 19:30:11
構造体とクラスについてです。宜しく御願いします。
初歩的な事で大変申し訳ないのですが教えて下さい。
using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            MyStruct ms1 = new MyStruct();
            MyStruct ms2;

            ms1.x = 20;
            ms2 = ms1;
            Console.WriteLine("ms2.x = {0}", ms2.x);
            ms2.x = 10;
            Console.WriteLine("ms1.x = {0}", ms1.x);

            MyClass mc1 = new MyClass();
            MyClass mc2;

            mc1.x = 20;
            mc2 = mc1;
            Console.WriteLine("mc2.x = {0}", mc2.x);
            mc2.x = 10;
            Console.WriteLine("mcc1.x = {0}", mc1.x);
        }
    }
}

struct MyStruct
{
    public int x;
}

class MyClass
{
    public int x;
}


mc1.x = 20;
mc2 = mc1;
Console.WriteLine("mc2.x = {0}", mc2.x);
mc2.x = 10;
Console.WriteLine("mc1.x = {0}", mc1.x);

上記のコードの時、mc1.xは20と表示されなければならないと一瞬思ってしまいました。
が、実際は10でした。

そこで考えたのが mc2 の中に mc1 がありその値に対してmc2.x = 10と代入されるので mc1.x = 10 となる

という事だろうと判断しました。がこの考えであってますでしょうか?