はじまり、はじまり。
今回は、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

おわり
