構造体とクラスについて への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 tecc  (社会人)
投稿日時
2010/3/12 19:57:21
値型を参照型ってそういう事でしたか。
ありがとうございました・・。
ありがとうございました・・。
投稿者 ?-?  (その他)
投稿日時
2010/3/12 19:45:40
> mc2 の中に mc1 があり
え?
ちゃうよ?
mc2=mc1で、コピーというより、「mc2はmc1のメモリ配置と同じ場所ですよ」とやっちゃったからじゃないの?
え?
ちゃうよ?
mc2=mc1で、コピーというより、「mc2はmc1のメモリ配置と同じ場所ですよ」とやっちゃったからじゃないの?
投稿者 tecc  (社会人)
投稿日時
2010/3/12 19:31:09
環境忘れました。
C#
コンソールアプリケーション
C#
コンソールアプリケーション
投稿者 tecc  (社会人)
投稿日時
2010/3/12 19:30:11
構造体とクラスについてです。宜しく御願いします。
初歩的な事で大変申し訳ないのですが教えて下さい。
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 となる
という事だろうと判断しました。がこの考えであってますでしょうか?
初歩的な事で大変申し訳ないのですが教えて下さい。
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 となる
という事だろうと判断しました。がこの考えであってますでしょうか?
[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箇所に「東京都杉並区」ができるので、それぞれの
場所で違う値を記憶しておけます。