C#、StaticClassのStaticMethodとStaticMemberについて

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


おわり

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です