フッターコンテンツにスキップ
.NETヘルプ

C# Pattern Matching Expressions(開発者向けの動作方法)

C#におけるパターンマッチングは、C# 7.0で導入された強力な機能で、以降のバージョンで拡張されています。 これは、条件文、型チェック、オブジェクトの分解を扱う際に、より簡潔で表現力豊かなコードを書くことを開発者に許します。

パターンマッチング式は、パターンに対して値をマッチングし、対応するコードブロックを実行するための柔軟で直感的な方法を提供します。 この記事では、C#のパターンマッチング式の複雑さを、構文、使用例、コード例を含めて探ります。 記事の最後では、IronPDF PDF生成ライブラリについて、Iron Softwareから、C#アプリケーションでオンザフライでPDFドキュメントを生成する方法についても少し探ります。

C#におけるパターンマッチングの利点

C#コードでのパターンマッチングは多数の利点を提供します:

-読みやすさの向上:パターン マッチングにより複雑な条件付きロジックが簡素化され、自分自身と他の開発者の両方にとってコードが理解しやすくなり、追跡しやすくなります。 -コード行数の削減:複雑な条件文を簡潔なパターンに凝縮することで、パターン マッチングによってコードベースが合理化され、コード行数が減り、実装がより簡潔になります。 -保守性の向上:パターン マッチングによって得られる明確さにより、コードの保守とデバッグが容易になります。 パターンが明確に区切られることで、コードベースの他の部分に影響を与えずに特定のロジックブロックを特定して変更することが容易になります。 -より表現力豊かなアルゴリズム:パターン マッチングにより、開発者はより自然で直感的な方法でアルゴリズムを表現できるようになります。 コード構造を問題解決のパラダイムに合わせることで、パターンマッチングは概念モデルに近似したアルゴリズムの作成を促進します。

C#でのパターンマッチングの種類

パターンマッチングは以下の式でサポートされます:

  • is
  • switch
  • switch

次のパターンは、構造と一致させるために使用できます:

宣言と型パターン

宣言と型パターンは、与えられた型と式の実行時型の互換性をチェックするためのC#の必須ツールです。宣言パターンを使用することで、互換性のチェックとローカル変数の宣言を同時に行うことができます。 次の例を考えてみましょう。

object greeting = "Iron Software is Awesome!";
if (greeting is string message)
{
    Console.WriteLine(message.ToLower());  // output: iron software is awesome!
}
object greeting = "Iron Software is Awesome!";
if (greeting is string message)
{
    Console.WriteLine(message.ToLower());  // output: iron software is awesome!
}
$vbLabelText   $csharpLabel

ここでは、宣言パターンが、式greetingが型stringと一致する場合、それをmessage変数に割り当てて、後続の操作を可能にします。

次のいずれかの条件が成り立つ場合、宣言パターンが有効です:

  • 式の実行時の型がTです。
  • 式の実行時の型がTから派生し、インターフェイスTを実装するか、Tに暗黙的に変換可能である。
  • 式の実行時の型がTを基になる型とするnullable値型である。
  • 式の実行時の型から型Tへのボクシングまたはアンボクシング変換が存在する。

以下の条件を示す例を考えてみましょう:

int? nullableX = 8;
int y = 45;
object boxedy = y;
if (nullableX is int a && boxedy is int b)
{
    Console.WriteLine(a + b);  // output: 53
}
int? nullableX = 8;
int y = 45;
object boxedy = y;
if (nullableX is int a && boxedy is int b)
{
    Console.WriteLine(a + b);  // output: 53
}
$vbLabelText   $csharpLabel

ここで、nullableXはnullable値型で基になる型intを持つため、パターンに一致します。また、boxedyはアンボクスできるため一致します。

新しい変数を宣言せずに式の型をチェックするだけでよい場合、以下の例のように_を利用できます:

public static decimal CalculateToll(Vehicle vehicle) => vehicle switch
{
    Bus _ => 4.00m,
    Motor _ => 8.50m,
    null => throw new ArgumentNullException(nameof(vehicle)),
    _ => throw new ArgumentException("Unknown type of a vehicle", nameof(vehicle)),
};
public static decimal CalculateToll(Vehicle vehicle) => vehicle switch
{
    Bus _ => 4.00m,
    Motor _ => 8.50m,
    null => throw new ArgumentNullException(nameof(vehicle)),
    _ => throw new ArgumentException("Unknown type of a vehicle", nameof(vehicle)),
};
$vbLabelText   $csharpLabel

このスニペットでは、_Vehicleに一致する任意の型のプレースホルダーとして機能します。

宣言と型パターンの両方は、パターンマッチング前に式が非nullであることを保証します。 以下に示すように否定されたnull定数パターンを使用して非nullをチェックできます:

if (inputVal is not null)
{
    // ...
}
if (inputVal is not null)
{
    // ...
}
$vbLabelText   $csharpLabel

この否定により、inputValがさらなる操作を行う前にがnullでないことを確認します。

C#コードで宣言と型パターンを利用することで、可読性を向上させ、コード行数を削減し、アルゴリズムをより効果的に表現できます。 これらのパターンは、型ベースのロジックを扱うための簡潔で表現力豊かな方法を提供し、コードベースの保守性を向上させます。

定数パターン

定数パターンは、式の結果が特定の定数値と一致するかどうかを検証します。 次の例を考えてみましょう。

public static decimal GetGroupTicketPrice(int visitorCount) => visitorCount switch
{
    1 => 2.0m,
    2 => 10.0m,
    3 => 25.0m,
    4 => 60.0m,
    0 => 0.0m,
    _ => throw new ArgumentException($"Not supported number of visitors: {visitorCount}", nameof(visitorCount)),
};
public static decimal GetGroupTicketPrice(int visitorCount) => visitorCount switch
{
    1 => 2.0m,
    2 => 10.0m,
    3 => 25.0m,
    4 => 60.0m,
    0 => 0.0m,
    _ => throw new ArgumentException($"Not supported number of visitors: {visitorCount}", nameof(visitorCount)),
};
$vbLabelText   $csharpLabel

ここでは、定数パターンがvisitorCountが特定の定数値のいずれかに一致するかどうかを確認し、対応するチケット価格を返します。

定数パターンでは、以下のような様々なタイプの定数式を使用できます:

  1. 整数または浮動小数点数のリテラル。
  2. 文字。
  3. 文字列リテラル。
  4. ブール値(trueまたはfalse)。
  5. 列挙型の値。
  6. 宣言された定数フィールドまたはローカルの名前。
  7. null

Span<char>またはReadOnlySpan<char>型の式は定数文字列と一致できます。

nullをチェックするには、次のような定数パターンを利用します:

if (inputVal is null)
{
    return;
}
if (inputVal is null)
{
    return;
}
$vbLabelText   $csharpLabel

ここで、パターンはinputValがnullであることを確認し、さらなる操作を行います。

また、否定されたnull定数パターンを使用して非null値を確認することもできます:

if (inputVal is not null)
{
    // ...
}
if (inputVal is not null)
{
    // ...
}
$vbLabelText   $csharpLabel

このパターンはinputValがnullでないことを確認し、その後の操作を安全に行えるようにします。

C#コードに定数パターンを組み込むことで、特定の定数値をマッチングする必要があるシナリオを効果的に処理し、コードの明確さと保守性を向上させます。

関係パターン

関係パターンは、定数と式の結果を比較する手段を提供します。 次の例を考えてみましょう。

Console.WriteLine(Classify(20));  // output: Too high
Console.WriteLine(Classify(double.NaN));  // output: Unknown
Console.WriteLine(Classify(4));  // output: Acceptable

static string Classify(double measurement) => measurement switch
{
    < -4.0 => "Too low",
    > 10.0 => "Too high",
    double.NaN => "Unknown",
    _ => "Acceptable",
};
Console.WriteLine(Classify(20));  // output: Too high
Console.WriteLine(Classify(double.NaN));  // output: Unknown
Console.WriteLine(Classify(4));  // output: Acceptable

static string Classify(double measurement) => measurement switch
{
    < -4.0 => "Too low",
    > 10.0 => "Too high",
    double.NaN => "Unknown",
    _ => "Acceptable",
};
$vbLabelText   $csharpLabel

ここでは、関係パターンがmeasurementを特定のしきい値と比較し、その分類を決定します。

関係パターンの右辺部分は、整数、浮動小数点、char、またはenum型でなければならない定数式でなければなりません。 <, >, <=, >=演算子を左辺に使用できます。

式の結果を特定の範囲内で一致させるには、以下に示すような結合的"and"パターンを使用します:

Console.WriteLine(GetCalendarSeason(new DateTime(2024, 3, 12)));  // output: spring
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 7, 12)));  // output: summer
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 2, 12)));  // output: winter

static string GetCalendarSeason(DateTime date) => date.Month switch
{
    >= 3 and < 6 => "spring",
    >= 6 and < 9 => "summer",
    >= 9 and < 12 => "autumn",
    12 or (>= 1 and <3) => "winter",
    _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 3, 12)));  // output: spring
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 7, 12)));  // output: summer
Console.WriteLine(GetCalendarSeason(new DateTime(2024, 2, 12)));  // output: winter

static string GetCalendarSeason(DateTime date) => date.Month switch
{
    >= 3 and < 6 => "spring",
    >= 6 and < 9 => "summer",
    >= 9 and < 12 => "autumn",
    12 or (>= 1 and <3) => "winter",
    _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
$vbLabelText   $csharpLabel

この抜粋は、月が特定の範囲内にあることに基づいてカレンダーシーズンを判定するために結合的"and"パターンがどのように使用されるかを説明します。 また、関係パターンは定数に対して式の結果を比較するための簡潔で表現豊かな手段を提供し、コードの明確さと保守性を向上させると述べています。

破棄パターン

破棄パターンは_で示され、nullを含む任意の式にマッチするために使用されます。 以下の例を考えてみましょう:

Console.WriteLine(GetDiscountInPercent(DayOfWeek.Friday));  // output: 5.0
Console.WriteLine(GetDiscountInPercent(null));  // output: 0.0
Console.WriteLine(GetDiscountInPercent((DayOfWeek)10));  // output: 0.0

static decimal GetDiscountInPercent(DayOfWeek? dayOfWeek) => dayOfWeek switch
{
    DayOfWeek.Monday => 0.5m,
    DayOfWeek.Tuesday => 12.5m,
    DayOfWeek.Wednesday => 7.5m,
    DayOfWeek.Thursday => 12.5m,
    DayOfWeek.Friday => 5.0m,
    DayOfWeek.Saturday => 2.5m,
    DayOfWeek.Sunday => 2.0m,
    _ => 0.0m,
};
Console.WriteLine(GetDiscountInPercent(DayOfWeek.Friday));  // output: 5.0
Console.WriteLine(GetDiscountInPercent(null));  // output: 0.0
Console.WriteLine(GetDiscountInPercent((DayOfWeek)10));  // output: 0.0

static decimal GetDiscountInPercent(DayOfWeek? dayOfWeek) => dayOfWeek switch
{
    DayOfWeek.Monday => 0.5m,
    DayOfWeek.Tuesday => 12.5m,
    DayOfWeek.Wednesday => 7.5m,
    DayOfWeek.Thursday => 12.5m,
    DayOfWeek.Friday => 5.0m,
    DayOfWeek.Saturday => 2.5m,
    DayOfWeek.Sunday => 2.0m,
    _ => 0.0m,
};
$vbLabelText   $csharpLabel

上記の破棄パターン例では、可能な限りの入力値を処理します。 週のすべての日が管理され、デフォルトの値が提供されます。 これにより、すべての可能な値が処理されます。 破棄パターンは、is式やswitch文でパターンとして使用できません。 そのような場合は、破棄とともにvarパターン、例えばvar _を使用して任意の式を一致させることができます。 ただし、破棄パターンはswitch式で許可されています。 詳細については、機能提案ノートの破棄パターンのセクションを参照してください。

論理パターン

C#の論理パターンは、否定、結合、分離を含む強力なツールを提供し、より柔軟で表現力豊かなマッチング条件を可能にします。

否定 (not パターン)

否定パターンはnotで示され、否定したパターンが式にマッチしないときに式と一致します。 これは、以下で示されるように、式が非nullであるかを確認するのに特に便利です:

if (input is not null)
{
    // ...
}
if (input is not null)
{
    // ...
}
$vbLabelText   $csharpLabel

ここでは、inputがnullでない場合にコードブロックが実行されます。

結合的 (and パターン)

結合パターンはandキーワードを使用し、両方のパターンが式にマッチするときに式を一致させます。 これにより、次の例で示されるように、複数の条件を組み合わせることができます:

Console.WriteLine(Classify(13));    // output: High
Console.WriteLine(Classify(-100));  // output: Too low
Console.WriteLine(Classify(5.7));   // output: Acceptable

static string Classify(double measurement) => measurement switch
{
    < -40.0 => "Too low",
    >= -40.0 and < 0 => "Low",
    >= 0 and < 10.0 => "Acceptable",
    >= 10.0 and < 20.0 => "High",
    >= 20.0 => "Too high",
    double.NaN => "Unknown",
};
Console.WriteLine(Classify(13));    // output: High
Console.WriteLine(Classify(-100));  // output: Too low
Console.WriteLine(Classify(5.7));   // output: Acceptable

static string Classify(double measurement) => measurement switch
{
    < -40.0 => "Too low",
    >= -40.0 and < 0 => "Low",
    >= 0 and < 10.0 => "Acceptable",
    >= 10.0 and < 20.0 => "High",
    >= 20.0 => "Too high",
    double.NaN => "Unknown",
};
$vbLabelText   $csharpLabel

この例では、measurementがその値の範囲に基づいて分類されています。

分離的 (or パターン)

分離パターンはorキーワードを使用し、いずれかのパターンが式にマッチするときに式を一致させます。 これにより、以下に示すように、複数の可能性のある条件を処理することができます:

Console.WriteLine(GetCalendarSeason(new DateTime(2021, 1, 19)));  // output: winter
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 10, 9)));  // output: autumn
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 5, 11)));  // output: spring

static string GetCalendarSeason(DateTime date) => date.Month switch
{
    3 or 4 or 5 => "spring",
    6 or 7 or 8 => "summer",
    9 or 10 or 11 => "autumn",
    12 or 1 or 2 => "winter",
    _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 1, 19)));  // output: winter
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 10, 9)));  // output: autumn
Console.WriteLine(GetCalendarSeason(new DateTime(2021, 5, 11)));  // output: spring

static string GetCalendarSeason(DateTime date) => date.Month switch
{
    3 or 4 or 5 => "spring",
    6 or 7 or 8 => "summer",
    9 or 10 or 11 => "autumn",
    12 or 1 or 2 => "winter",
    _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
};
$vbLabelText   $csharpLabel

ここで、提供された日付の月に基づいてカレンダーシーズンが決定されます。

これらのパターンコンビネータを繰り返し使用することで、より複雑で精密なマッチング条件を作成し、コードの柔軟性と可読性を向上させることができます。

プロパティパターン

プロパティパターンは、ネストされたパターンに対して式のプロパティやフィールドをマッチングすることを可能にします。 このことの例として、以下のコードスニペットをご覧ください:

static bool IsConferenceDay(DateTime date) => date is { Year: 2020, Month: 5, Day: 19 or 20 or 21 };
static bool IsConferenceDay(DateTime date) => date is { Year: 2020, Month: 5, Day: 19 or 20 or 21 };
$vbLabelText   $csharpLabel

ここで、プロパティパターンは、提供された日付が指定されたカンファレンスの日のいずれかに対応していることを保証します。

また、以下に示すように、プロパティパターン内でランタイム型チェックと変数宣言を組み込むことができます:

static string TakeFive(object input) => input switch
{
    string { Length: >= 5 } s => s.Substring(0, 5),
    string s => s,
    ICollection<char> { Count: >= 5 } symbols => new string(symbols.Take(5).ToArray()),
    ICollection<char> symbols => new string(symbols.ToArray()),
    null => throw new ArgumentNullException(nameof(input)),
    _ => throw new ArgumentException("Unsupported input type."),
};
static string TakeFive(object input) => input switch
{
    string { Length: >= 5 } s => s.Substring(0, 5),
    string s => s,
    ICollection<char> { Count: >= 5 } symbols => new string(symbols.Take(5).ToArray()),
    ICollection<char> symbols => new string(symbols.ToArray()),
    null => throw new ArgumentNullException(nameof(input)),
    _ => throw new ArgumentException("Unsupported input type."),
};
$vbLabelText   $csharpLabel

ここでは、プロパティパターンが文字列と文字のコレクションを処理し、それらのプロパティに基づいて適切に処理することを保証します。

位置パターン

C#における位置パターンは、式の結果を分解し、対応するネストされたパターンに対して結果の値をマッチングすることを可能にします。 例えば:

public readonly struct Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) => (X, Y) = (x, y);
    public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}

static string Classify(Point point) => point switch
{
    (0, 0) => "Origin",
    (1, 0) => "Positive X basis end",
    (0, 1) => "Positive Y basis end",
    _ => "Just a point",
};
public readonly struct Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) => (X, Y) = (x, y);
    public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}

static string Classify(Point point) => point switch
{
    (0, 0) => "Origin",
    (1, 0) => "Positive X basis end",
    (0, 1) => "Positive Y basis end",
    _ => "Just a point",
};
$vbLabelText   $csharpLabel

この例では、位置パターンが座標に基づいてポイントを分類するために利用されています。

さらに、C# 10で導入された拡張プロパティパターンと呼ばれる、プロパティパターン内でネストされたプロパティやフィールドを参照することができます:

static bool IsAnyEndOnXAxis(Segment segment) =>
    segment is { Start.Y: 0 } or { End.Y: 0 };
static bool IsAnyEndOnXAxis(Segment segment) =>
    segment is { Start.Y: 0 } or { End.Y: 0 };
$vbLabelText   $csharpLabel

この機能は、ネストされたプロパティに直接アクセスすることでプロパティパターンの柔軟性を向上させます。

これらのパターンは、複雑なデータ構造を扱うための強力なメカニズムを提供し、コードの可読性と表現力を向上させます。

Varパターン

Varパターンは、任意の型にマッチすることを許可します。 これは特に、スイッチケースガードで複数のチェックが必要な場合や、ブール式内で中間結果をキャプチャするのに便利です。

以下は、Boolean式におけるvarパターンの使用を示す例です:

static bool IsAcceptable(int id, int absLimit) =>
    SimulateDataFetch(id) is var results 
    && results.Min() >= -absLimit 
    && results.Max() <= absLimit;

static int [] SimulateDataFetch(int id)
{
    var rand = new Random();
    return Enumerable
               .Range(start: 0, count: 5)
               .Select(s => rand.Next(minValue: -10, maxValue: 11))
               .ToArray();
}
static bool IsAcceptable(int id, int absLimit) =>
    SimulateDataFetch(id) is var results 
    && results.Min() >= -absLimit 
    && results.Max() <= absLimit;

static int [] SimulateDataFetch(int id)
{
    var rand = new Random();
    return Enumerable
               .Range(start: 0, count: 5)
               .Select(s => rand.Next(minValue: -10, maxValue: 11))
               .ToArray();
}
$vbLabelText   $csharpLabel

この例では、SimulateDataFetch が整数の配列を返し、is varパターンが結果をresults変数にキャプチャし、そのプロパティに基づいて後続の計算を許可します。

さらに、varパターンは、スイッチ式や文内で、より簡潔で読みやすいコードのために利用できます。 以下は、スイッチケースガードでのvarパターンの使用例です:

public record Point(int X, int Y);

static Point Transform(Point point) => point switch
{
    var (x, y) when x < y => new Point(-x, y),
    var (x, y) when x > y => new Point(x, -y),
    var (x, y) => new Point(x, y),
};

static void TestTransform()
{
    Console.WriteLine(Transform(new Point(1, 2)));  // output: Point { X = -1, Y = 2 }
    Console.WriteLine(Transform(new Point(5, 2)));  // output: Point { X = 5, Y = -2 }
}
public record Point(int X, int Y);

static Point Transform(Point point) => point switch
{
    var (x, y) when x < y => new Point(-x, y),
    var (x, y) when x > y => new Point(x, -y),
    var (x, y) => new Point(x, y),
};

static void TestTransform()
{
    Console.WriteLine(Transform(new Point(1, 2)));  // output: Point { X = -1, Y = 2 }
    Console.WriteLine(Transform(new Point(5, 2)));  // output: Point { X = 5, Y = -2 }
}
$vbLabelText   $csharpLabel

この例では、varパターン(x, y)がポイントの座標をキャプチャし、その値に基づいてさまざまな変換を許可します。

varパターンでは、宣言された変数の型は、パターンに対してマッチングされる式のコンパイル時型から推測されます。

varパターンは、表現の具体的な型が事前に知られていないさまざまなシナリオを処理する便利な方法を提供し、コードの明確さと柔軟性を向上させます。

IronPDFライブラリの紹介

IronPDFドキュメントレンダリング は Iron Softwareからのライブラリで、PDFドキュメント生成を専門としています。 最初に行うべきことは、NuGetパッケージマネージャーから、またはVisual Studioパッケージマネージャーからライブラリをインストールすることです。

# To install from the NuGet Package Manager Console
Install-Package IronPdf
# To install from the NuGet Package Manager Console
Install-Package IronPdf
SHELL

以下の画像はVisual Studioインストールガイドからのインストール方法を示しています。

C# Pattern Matching Expressions (How It Works For Developers): Figure 1 - IronPDFをNuGetパッケージマネージャーでインストール

以下のコードでは、簡単なPDFドキュメントを生成する方法を見てみましょう:

using IronPdf;

namespace IronPatterns
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("-----------Iron Software-------------");
            var renderer = new ChromePdfRenderer(); // var pattern
            var content = " <h1> Iron Software is Awesome </h1> Made with IronPDF!";

            // Declaration Pattern
            int? nullableX = 8;
            int y = 45;
            object boxedy = y;
            content += "<p>Declaration Pattern</p>";
            if (nullableX is int a && boxedy is int b)
            {
                Console.WriteLine(a + b); // output: 53
                content += $"<p>Output: {(a + b)}</p>";
            }

            // Relational patterns
            content += "<p>Relational patterns</p>";
            var season1 = GetCalendarSeason(new DateTime(2024, 2, 25));
            Console.WriteLine(season1);
            content += $"<p>2024, 2, 25: {season1}</p>";
            var season2 = GetCalendarSeason(new DateTime(2024, 5, 25));
            Console.WriteLine(season2);
            content += $"<p>2024, 5, 25: {season2}</p>";
            var season3 = GetCalendarSeason(new DateTime(2024, 7, 25));
            Console.WriteLine(season3);
            content += $"<p>2024, 7, 25: {season3}</p>";

            var pdf = renderer.RenderHtmlAsPdf(content);
            pdf.SaveAs("output.pdf"); // Saves our PdfDocument object as a PDF        
        }

        static string GetCalendarSeason(DateTime date) => date.Month switch
        {
            >= 3 and < 6 => "spring",
            >= 6 and < 9 => "summer",
            >= 9 and < 12 => "autumn",
            12 or (>= 1 and < 3) => "winter",
            _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
        };
    }
}
using IronPdf;

namespace IronPatterns
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("-----------Iron Software-------------");
            var renderer = new ChromePdfRenderer(); // var pattern
            var content = " <h1> Iron Software is Awesome </h1> Made with IronPDF!";

            // Declaration Pattern
            int? nullableX = 8;
            int y = 45;
            object boxedy = y;
            content += "<p>Declaration Pattern</p>";
            if (nullableX is int a && boxedy is int b)
            {
                Console.WriteLine(a + b); // output: 53
                content += $"<p>Output: {(a + b)}</p>";
            }

            // Relational patterns
            content += "<p>Relational patterns</p>";
            var season1 = GetCalendarSeason(new DateTime(2024, 2, 25));
            Console.WriteLine(season1);
            content += $"<p>2024, 2, 25: {season1}</p>";
            var season2 = GetCalendarSeason(new DateTime(2024, 5, 25));
            Console.WriteLine(season2);
            content += $"<p>2024, 5, 25: {season2}</p>";
            var season3 = GetCalendarSeason(new DateTime(2024, 7, 25));
            Console.WriteLine(season3);
            content += $"<p>2024, 7, 25: {season3}</p>";

            var pdf = renderer.RenderHtmlAsPdf(content);
            pdf.SaveAs("output.pdf"); // Saves our PdfDocument object as a PDF        
        }

        static string GetCalendarSeason(DateTime date) => date.Month switch
        {
            >= 3 and < 6 => "spring",
            >= 6 and < 9 => "summer",
            >= 9 and < 12 => "autumn",
            12 or (>= 1 and < 3) => "winter",
            _ => throw new ArgumentOutOfRangeException(nameof(date), $"Date with unexpected month: {date.Month}."),
        };
    }
}
$vbLabelText   $csharpLabel

出力

C# Pattern Matching Expressions (How It Works For Developers): Figure 2

コードの詳細

ここではIronPDFのChromePdfRendererクラスを使ってHTML文字列をPDFドキュメントとして保存しています。 出力は"output.pdf"ドキュメントに保存されます。

試用ライセンス

IronPDFは試用ライセンスを通じて利用可能で、IronPDFライセンスページから取得できます。 ライセンスキーをメールに届けるためにメールIDを提供してください。

"IronPDF.LicenseKey": "<Your Key>"
"IronPDF.LicenseKey": "<Your Key>"
$vbLabelText   $csharpLabel

上記のようにライセンスキーをappsettings.jsonファイルに配置します。

結論

C#のパターンマッチング式は、条件文、型チェック、オブジェクトの分解を簡潔で読みやすい方法で記述する強力で柔軟な方法を提供します。 パターンマッチングを利用することで、開発者はコードの明確さと保守性を向上させ、ボイラープレートと冗長性を減らすことができます。 型チェック、スイッチステートメントまたはデコンストラクションにかかわらず、パターンマッチング式はC#の幅広いプログラミングタスクに取り組むための多用途のツールセットを提供します。

結論として、パターンマッチング式を習得することは、C#プログラミングスキルを大幅に向上させ、よりクリーンで表現力豊かなコードを書くことができ、理解しやすく保守しやすくなります。 IronPDFのHTMLからPDFへの生成能力についても取り上げ、PDFドキュメントを生成するために活用できます。

よくある質問

コードの読みやすさを向上させるために C# でパターンマッチングをどのように使用できますか?

C# のパターンマッチングを使用すると、開発者はより簡潔で表現豊かなコードを書くことができ、条件文をより明確で理解しやすくします。これにより、コードブロックの複雑さを軽減することで、読みやすさと保守性が向上します。

C# で利用可能なパターンマッチング式にはどのような種類がありますか?

C# は is 式、switch ステートメント、および switch 式など、さまざまなパターンマッチング式をサポートしています。各タイプは、式を評価し、マッチングパターンに基づいてコードを実行するための異なる方法を提供します。

C# を使用して PDF ドキュメントを生成するにはどうすればよいですか?

IronPDF という Iron Software のライブラリを使用すると、C# で PDF ドキュメントを生成できます。HTML コンテンツを PDF に変換でき、NuGet を介して簡単にインストールでき、幅広い PDF 生成機能を提供します。

C# パターンマッチングにおける宣言と型のパターンとは何ですか?

C# の宣言と型のパターンは、式の実行時の型が指定された型と一致するかどうかをチェックし、一致が成功した場合に新しいローカル変数を宣言することを可能にし、型安全な操作を促進します。

C# の定数パターンはどのように機能しますか?

C# の定数パターンは、整数や文字列のような特定の定数値と式が等しいかどうかをチェックし、一致した場合は特定のロジックを実行して、直接的な定数値比較を可能にします。

C# の関係パターンの目的は何ですか?

C# の関係パターンは、<><=>= のような関係演算子を使用して定数と式を比較することを可能にします。これは、コード内で簡潔な範囲チェックを実装するのに役立ちます。

C# で論理パターンをどのように適用できますか?

C# の論理パターンは、andornot や他の論理演算子を使用して他のパターンを組み合わせ、複数の基準を同時に評価できる複雑なパターンマッチング条件を可能にします。

C# のディスカードパターンとは何で、いつ使用されますか?

C# のディスカードパターンは、_ で表され、null を含む任意の式と一致し、switch 式などの特定の値を無視する必要がある状況で一般的に使用されます。

C# でプロパティパターンをどのように利用できますか?

C# のプロパティパターンは、開発者がオブジェクトのプロパティやフィールドをネストされたパターンと一致させることを可能にし、オブジェクトの構造を深くチェックしながら、明確で簡潔なコードを維持する方法を提供します。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

Jacob Mellorは、Iron Softwareの最高技術責任者であり、C# PDF技術の開拓者としてその先進的な役割を担っています。Iron Softwareのコアコードベースのオリジナルデベロッパーである彼は、創業時から製品のアーキテクチャを形作り、CEOのCameron Rimingtonと協力してNASA、Tesla、全世界の政府機関を含む50人以上の会社に成長させました。

Jacobは、1998年から2001年にかけてマンチェスター大学で土木工学の第一級優等学士号(BEng)を取得しました。1999年にロンドンで最初のソフトウェアビジネスを立ち上げ、2005年には最初の.NETコンポーネントを作成し、Microsoftエコシステムにおける複雑な問題の解決を専門にしました。

彼の旗艦製品であるIronPDFとIronSuite .NETライブラリは、全世界で3000万以上のNuGetインストールを達成しており、彼の基本コードが世界中で使用されている開発者ツールを支えています。商業的な経験を25年間積み、コードを書くことを41年間続けるJacobは、企業向けのC#、Java、およびPython PDF技術の革新を推進し続け、次世代の技術リーダーを指導しています。