0Pricing
C# Academy · レッスン

ローカル関数の宣言

メソッド内にヘルパー関数を定義します。

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

ローカル関数とは

ローカル関数は、別のメソッドの内部で宣言されたメソッドです。それを含むメンバー内でのみ参照できるため、ヘルパーロジックを使用箇所の近くに置き、クラスの表面に公開せずに済みます。

ローカル関数を宣言する

ローカル関数は通常のメソッドと同じように、メソッド本体の内部にネストして記述します。同じスコープ内であれば、宣言の前後どちらからでも呼び出せます。

using System;

public class Program
{
    public static void Main()
    {
        int Square(int n) => n * n;

        Console.WriteLine(Square(4));
        Console.WriteLine(Square(7));
    }
}

ブロック本体を持つローカル関数

ローカル関数には、通常のメソッドと同じように、複数のステートメント、ループ、独自のローカル変数を含む完全なブロック本体を記述できます。

using System;

public class Program
{
    public static void Main()
    {
        int Factorial(int n)
        {
            int result = 1;
            for (int i = 2; i <= n; i++) result *= i;
            return result;
        }

        Console.WriteLine(Factorial(5));
    }
}

可読性を高める

ローカル関数を使うと、1つのメソッドからしか使わないヘルパーのために private メソッドを作成してクラスを複雑にせず、ロジックに名前を付けられます。関連するコードをまとめておけるため、見通しもよくなります。

using System;

public class Program
{
    public static void Main()
    {
        string Format(string label, int value) => label + ": " + value;

        Console.WriteLine(Format("Score", 90));
        Console.WriteLine(Format("Level", 3));
    }
}

ローカル関数による再帰

ローカル関数は自分自身を呼び出せるため、必要な場所で再帰を簡単に表現できます。

using System;

public class Program
{
    public static void Main()
    {
        int Fib(int n) => n < 2 ? n : Fib(n - 1) + Fib(n - 2);

        for (int i = 0; i < 7; i++)
            Console.Write(Fib(i) + " ");
        Console.WriteLine();
    }
}

ローカル関数は使用箇所の後に宣言できる

ローカル変数とは異なり、ローカル関数は宣言されている場所より前のメソッド内から参照できます。コンパイラーは、それを含むスコープ全体を解決します。

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Greet("Ada")); // used before declared

        string Greet(string name) => "Hello, " + name;
    }
}

パラメーターと戻り値の型

ローカル関数は通常のメソッドと同じ機能をすべてサポートします。複数のパラメーター、戻り値、ref と out のパラメーター、ジェネリックを利用できます。

using System;

public class Program
{
    public static void Main()
    {
        bool TryHalve(int n, out int half)
        {
            half = n / 2;
            return n % 2 == 0;
        }

        if (TryHalve(10, out int result))
            Console.WriteLine("half is " + result);
    }
}

ジェネリックなローカル関数

ローカル関数はジェネリックにでき、外側のメソッドとは独立して独自の型引数を受け取れます。

using System;

public class Program
{
    public static void Main()
    {
        T Echo<T>(T value)
        {
            Console.WriteLine("echoing " + value);
            return value;
        }

        int n = Echo(42);
        string s = Echo("hi");
        Console.WriteLine(n + " " + s);
    }
}

ローカル関数のネスト

ローカル関数の内部に、さらにローカル関数を含めることができます。内側の関数は親のローカル関数内でのみ参照できるため、ヘルパーの階層を厳密な範囲に限定できます。

using System;

public class Program
{
    public static void Main()
    {
        int Compute(int x)
        {
            int Double(int n) => n * 2;
            int AddOne(int n) => n + 1;
            return Double(AddOne(x));
        }

        Console.WriteLine(Compute(5));
    }
}

引数の検証にローカル関数を使う

よく使われるパターンは、引数をすぐに検証してから、実際の処理をローカル関数に委ねる方法です。イテレーターでは検証を直ちに実行できるため、特に便利です。

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Range(int start, int count)
    {
        if (count < 0) throw new ArgumentOutOfRangeException(nameof(count));
        return Iterate();

        IEnumerable<int> Iterate()
        {
            for (int i = 0; i < count; i++) yield return start + i;
        }
    }

    public static void Main()
    {
        foreach (var n in Range(10, 3)) Console.WriteLine(n);
    }
}

ローカル関数を使う場面

ヘルパーが1つのメソッドからだけ使われる場合、説明的な名前を付けると分かりやすくなる場合、またはメソッド内のローカル状態にアクセスする必要がある場合は、ローカル関数を使います。クラスをすっきり保ちながら、ロジックを見つけやすくできます。

using System;

public class Program
{
    public static void Main()
    {
        int total = 0;
        void Add(int n) => total += n; // helper tied to this method
        Add(3); Add(4); Add(5);
        Console.WriteLine(total);
    }
}

クイックチェック

ローカル関数とは何かを思い出してください。

まとめ

ローカル関数は、メソッドの内部にネストされた名前付きのヘルパーです。

  • それを含むメンバー内でのみ参照できます。
  • パラメーター、戻り値、out/ref、ジェネリック、再帰をサポートします。
  • 宣言より前から参照できます。
  • 1回だけ使うヘルパーや、イテレーターでの引数の即時検証に適しています。

よくある質問

「ローカル関数の宣言」レッスンは無料ですか?

はい。「ローカル関数の宣言」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと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. 静的ローカル関数
  4. ローカル関数とラムダの比較
← C# Academyに戻る