0Pricing
C# Academy · レッスン

静的メソッドとフィールド

型そのものに属するメンバーを定義します。

「静的メソッドとフィールド」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

静的メンバーとインスタンスメンバー

インスタンスメンバーは各オブジェクトに属し、静的メンバーはクラス自体に属します。静的メンバーは正確に1つだけ存在し、すべてのオブジェクトで共有されます。

using System;

class Counter
{
    public static int Total;   // shared
    public int Id;             // per instance
}

class Program
{
    static void Main()
    {
        Counter.Total = 5;
        Console.WriteLine("Shared Total: " + Counter.Total);
    }
}

静的フィールドの宣言

static フィールドには、インスタンスではなくクラス名を通してアクセスします。つまり ClassName.Field のように記述します。

using System;

class Bank
{
    public static decimal InterestRate = 0.05m;
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Rate: " + Bank.InterestRate);
    }
}

静的メソッド

static メソッドはインスタンスなしで実行されます。クラスに対して呼び出します。this が存在しないため、インスタンスフィールドは使用できません。

using System;

class MathUtil
{
    public static int Square(int x)
    {
        return x * x;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(MathUtil.Square(7));
    }
}

インスタンス間で共有される状態

静的フィールドは1つのコピーしか持たないため、すべてのインスタンスが同じ値を参照します。カウンターや共有構成に便利です。

using System;

class Robot
{
    public static int Count;

    public Robot()
    {
        Count++;
    }
}

class Program
{
    static void Main()
    {
        new Robot();
        new Robot();
        new Robot();
        Console.WriteLine("Robots created: " + Robot.Count);
    }
}

静的メソッドはインスタンスデータを使用できません

静的メソッドには this がないため、使用できるのはパラメーター、ローカル変数、ほかの静的メンバーだけです。

using System;

class Calculator
{
    public static int Add(int a, int b) => a + b;
    public static int Multiply(int a, int b) => a * b;
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Calculator.Add(2, 3));
        Console.WriteLine(Calculator.Multiply(4, 5));
    }
}

静的メンバーとインスタンスメンバーの混在

1つのクラスに両方の種類を含めることができます。インスタンスメソッドからは静的メンバーを読み取れますが、静的メソッドからインスタンスメンバーを読み取ることはできません。

using System;

class Account
{
    public static decimal Fee = 2m;
    public decimal Balance;

    public decimal NetBalance()
    {
        return Balance - Fee;   // instance method can read static
    }
}

class Program
{
    static void Main()
    {
        var a = new Account { Balance = 100m };
        Console.WriteLine("Net: " + a.NetBalance());
    }
}

静的カウンターのパターン

静的カウンターから新しいオブジェクトごとに ID を割り当てる方法は、静的フィールドの典型的な使用例です。

using System;

class Ticket
{
    private static int _next = 1;
    public int Number;

    public Ticket()
    {
        Number = _next++;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(new Ticket().Number);
        Console.WriteLine(new Ticket().Number);
        Console.WriteLine(new Ticket().Number);
    }
}

静的ヘルパーメソッド

静的メソッドは、フォーマッターやコンバーターのように、入力だけに依存する状態を持たない処理に適しています。

using System;

class Format
{
    public static string Money(decimal amount)
    {
        return "$" + amount.ToString("0.00");
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Format.Money(12.5m));
    }
}

静的メソッドから静的メソッドを呼び出す

静的メソッドは、インスタンスなしで同じクラス内のほかの静的メソッドを自由に呼び出せます。

using System;

class Geometry
{
    public static double CircleArea(double r) => Math.PI * Square(r);
    private static double Square(double x) => x * x;
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Geometry.CircleArea(2).ToString("0.00"));
    }
}

静的フィールドは値を保持する

静的フィールドは1つのオブジェクトだけでなく、プログラムの実行期間全体にわたって値を保持します。キャッシュや累計値に使用できます。

using System;

class Logger
{
    public static int MessageCount;

    public static void Log(string msg)
    {
        MessageCount++;
        Console.WriteLine("[" + MessageCount + "] " + msg);
    }
}

class Program
{
    static void Main()
    {
        Logger.Log("start");
        Logger.Log("working");
        Logger.Log("done");
    }
}

まとめてみましょう

静的メンバーは、共有レートやカウンター、状態を持たないヘルパーなど、クラス全体に関係する概念を表します。一方、インスタンスメンバーはオブジェクトごとのデータを保持します。

using System;

class Order
{
    public static decimal TaxRate = 0.10m;
    public decimal Subtotal;

    public decimal Total() => Subtotal + Subtotal * TaxRate;
}

class Program
{
    static void Main()
    {
        var o = new Order { Subtotal = 200m };
        Console.WriteLine("Total: " + o.Total());
    }
}

理解度チェック

静的メンバーについての理解度を確認しましょう。

まとめ

静的メンバーはクラスに属し、共有されるコピーを1つだけ持ちます。一方、インスタンスメンバーは各オブジェクトに属します。静的メソッドには this がなく、インスタンスデータには触れませんが、インスタンス側のコードから静的メンバーを読み取ることはできます。カウンター、共有構成、状態を持たないヘルパーには static を使用します。

using System;

class Demo
{
    public static int Shared;
    public int Own;
    public static void Bump() => Shared++;
}

class Program
{
    static void Main()
    {
        Demo.Bump();
        Demo.Bump();
        Console.WriteLine(Demo.Shared);
    }
}

よくある質問

「静的メソッドとフィールド」レッスンは無料ですか?

はい。「静的メソッドとフィールド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「静的メソッドとフィールド」で何を学びますか?

型そのものに属するメンバーを定義します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「静的メソッドとフィールド」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 静的メソッドとフィールド
  2. ユーティリティ用の静的クラス
  3. 定数とreadonlyフィールド
  4. 静的設計とインスタンス設計
← C# Academyに戻る