まずは、次のプログラムを見てください。
// field01.cs using System; class MyClass { int x; public void Show() { Console.WriteLine("x = {0}", x); } public void Set(int y) { x = y; } } class field01 { public static void Main() { MyClass mc = new MyClass(); mc.Show(); mc.Set(100); mc.Show(); } }MyClassクラスには、インタンスフィールドのxがあります。アクセス修飾子が省略されているのでprivateとみなされ、このクラス以外からはアクセス不能です。
Showメソッドは、xの値を表示するメソッドです。
Setメソッドは、引数yをxに代入するメソッドです。
Mainメソッド側では、まずMyClassクラスのインスタンスを生成しています。
次に、いきなりmc.Show();でxの値を表示しようとしています。xには、まだ値を代入していませんね。しかし、インスタンスフィールドは、インスタンス生成の時自動的に初期化されるので問題有りません。「x = 0」と表示されるでしょう。
次に、mc.Set(100);として、xに100を代入しています。その後mc.Show();でxの値を表示させています。
では、実行結果を見てみましょう。
次のプログラムの実行結果はどのようになるか、考えてみてください。
// field02.cs using System; class MyClass { public static int x; public int y; public void Show() { Console.WriteLine("x = {0}, y = {1}", x, y); } } class field02 { public static void Main() { MyClass.x = 10; MyClass mc1 = new MyClass(); mc1.y = 20; Console.WriteLine("1回目-------"); mc1.Show(); MyClass mc2 = new MyClass(); Console.WriteLine("2回目-------"); mc2.Show(); MyClass mc3 = new MyClass(); mc3.y = 500; Console.WriteLine("3回目-------"); mc3.Show(); mc3 = mc2; Console.WriteLine("4回目-------"); mc3.Show(); } }MyClassクラスには、静的フィールドのxと、インスタンスフィールドのyが有ります。 また、Showメソッドはxやyの値を表示するメソッドです。
Mainメソッドでは、MyClass.x = 10;として、静的フィールドxに10を代入しています。
次にMyClassのインスタンスを生成して、その参照をmc1に代入しています。
ここで、mc1.y = 20;としてインスタンスフィールドyに20を代入しています。
そこで、第1回目のmc1.Show();を実行するとどのように表示されるでしょうか。 当然yは20ですね。xはどうでしょうか。静的フィールドは、そのクラスのすべてのインスタンスに反映されるのでxの値は10なのです。「x = 10, y = 20」と表示されるでしょう。
次に、またインスタンスを生成してその参照をmc2としています。ここで、いきなり第2回目の表示をさせています。インスタンスフィールドには先ほど20を代入したので「y = 20」と表示されるのでしょうか。答はノーです。インスタンスフィールドは、その名の通りそれぞれのインスタンス固有のものです。mc2のyには、まだ何も代入していないのでyは0のはずです。従って「x = 10, y = 0」と表示されるはずです。
次に、またインスタンスを生成してmc3としています。mc3.y = 500;としmc3のインスタンスフィールドyに500を代入しています。当然mc3.Show();を実行するとx = 10, y = 500」と表示されますね。
さて、次にmc3 = mc2;としています。これは、mc2の参照をmc3に代入しているのですね。 すると、mc3.Show();はmc2.Show();と同じことになります。第4回目の表示では、「x = 10, y = 0」となるはずです。
では、実行結果を見てみましょう。
Update 29/Aug/2006 By Y.Kumei