はじまり、はじまり。
今回は、StaticClass についてまとめました。
■ ■ ■ ■ 目次
1. エラーなしのコード
2. メソッドについて
2-1. Static でないメソッドを定義した時
2-2. Static でないメソッドを呼び出した時
3. メンバーについて
3-1. Static でないメンバーを定義した時
3-2. Static でないメンバーを使用した時
4. おまけ (Static でないメソッドとメンバーを定義して、未使用の時どうなっているか)
■ ■ ■ ■ 結論
Static でないメソッド/メンバーを定義してもエラーにならない。使用するとエラーとなる。
■ ■ ■ ■ 確認結果
■ ■ ■ 1. エラーなしのコード
当然、コンパイル/実行共エラーはありません。
■ テストコード (test1.cs)
------------------- using System; public class BaseClass { public static BaseClass Create() { Console.WriteLine("BaseClass.Create()"); return new BaseClass(); } } class MainClass { static void Main(string[] args) { Console.WriteLine("MainClass.Main()"); BaseClass.Create(); } } -------------------
■ コンパイル結果
------------------- C:\CSharp>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nologo test1.cs C:\CSharp> -------------------
■ 実行結果
------------------- C:\CSharp>test1.exe MainClass.Main() BaseClass.Create() C:\CSharp> -------------------
■ ■ ■ 2. メソッドについて
■ ■ 2-1. Static でないメソッドを定義した時
コンパイル/実行共エラーはありません。実行結果は 1 と同じです。
■ テストコード (test2-1.cs)
------------------- using System; public class BaseClass { public static BaseClass Create() { Console.WriteLine("BaseClass.Create()"); return new BaseClass(); } public BaseClass Create2() { Console.WriteLine("BaseClass.Create2()"); return new BaseClass(); } } class MainClass { static void Main(string[] args) { Console.WriteLine("MainClass.Main()"); BaseClass.Create(); } } -------------------
■ コンパイル結果
------------------- C:\CSharp>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nologo test2-1.cs C:\CSharp> -------------------
■ 実行結果
------------------- C:\CSharp>test2-1.exe MainClass.Main() BaseClass.Create() C:\CSharp> -------------------
■ ■ 2-2. Static でないメソッドを呼び出した時
「Static でないメソッド」を呼び出した所で、コンパイルエラーが発生します。
■ テストコード (test2-2.cs)
------------------- using System; public class BaseClass { public static BaseClass Create() { Console.WriteLine("BaseClass.Create()"); return new BaseClass(); } public BaseClass Create2() // 11 Line { Console.WriteLine("BaseClass.Create2()"); return new BaseClass(); } } class MainClass { static void Main(string[] args) { Console.WriteLine("MainClass.Main()"); BaseClass.Create(); BaseClass.Create2(); // 24 Line } } -------------------
■ コンパイル結果
------------------- C:\CSharp>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nologo test2-2.cs test2-2.cs(24,9): error CS0120: 静的でないフィールド、メソッド、またはプロパティ 'BaseClass.Create2()' で、オブジェクト参照が必要です test2-2.cs(11,22): (以前のエラーに関連するシンボルの位置) C:\CSharp> -------------------
■ ■ ■ 3. メンバーについて
■ ■ 3-1. Static でないメンバーを定義した時
コンパイルにメンバーが使われていないための warning が表示されます。実行エラーはありません。実行結果は 1 と同じです。
■ テストコード (test3-1.cs)
------------------- using System; public class BaseClass { private string BaseString = "Aikotobaha"; // 5 Line public static BaseClass Create() { Console.WriteLine("BaseClass.Create()"); Console.WriteLine("BaseString:"); // 10 Line return new BaseClass(); } } class MainClass { static void Main(string[] args) { Console.WriteLine("MainClass.Main()"); BaseClass.Create(); } } -------------------
■ コンパイル結果
------------------- C:\CSharp>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nologo test3-1.cs test3-1.cs(5,20): warning CS0414: フィールド 'BaseClass.BaseString' は割り当てられていますが、その値が使用されていません。 C:\CSharp> -------------------
■ 実行結果
------------------- C:\CSharp>test3-1.exe MainClass.Main() BaseClass.Create() BaseString: C:\CSharp> -------------------
■ ■ 3-2. Static でないメンバーを使用した時
「Static でないメンバー」を呼び出した所で、コンパイルエラーが発生しました。
■ テストコード (test3-2.cs)
------------------- using System; public class BaseClass { private string BaseString = "Aikotobaha"; // 5 Line public static BaseClass Create() { Console.WriteLine("BaseClass.Create()"); Console.WriteLine("BaseString:" + BaseString); // 10 Line return new BaseClass(); } } class MainClass { static void Main(string[] args) { Console.WriteLine("MainClass.Main()"); BaseClass.Create(); } } -------------------
■ コンパイル結果
------------------- C:\CSharp>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nologo test3-2.cs test3-2.cs(10,43): error CS0120: 静的でないフィールド、メソッド、またはプロパティ 'BaseClass.BaseString' で、オブジェクト参照が必要です test3-2.cs(5,20): (以前のエラーに関連するシンボルの位置) C:\CSharp> -------------------
■ ■ ■ 4. おまけ
Static でないメソッドとメンバーが定義されていて、使われて無い時、コンパイルされているか調べてみました。調べ方は、ILSpy でコンパイルしたexeをデコンパイルしました。
■ ■ 4-1. 「test2-1.exe」をILSpyで表示しました。
使えない「public BaseClass Create2()」もしっかりコンパイルされています。
■ test2-1.jpg
■ ■ 4-2. 「test3-1.exe」をILSpyで表示しました。
使えない「private string BaseString = "Aikotobaha";
」もしっかりコンパイルされています。
■ test3-1.jpg
おわり