透かしなしで本番環境でテストしてください。
必要な場所で動作します。
30日間、完全に機能する製品をご利用いただけます。
数分で稼働させることができます。
製品トライアル期間中にサポートエンジニアリングチームへの完全アクセス
差別された労働組合タグ付き結合型や和型としても知られるこの型は、さまざまな形をとることができるデータをモデル化するための強力なツールですが、よく定義された限られたケースに限られます。 C#には、他の言語のようなネイティブの識別ユニオンはありませんが(例:F#またはRust).NET、Java、Python、またはNode.jsを使用するプロジェクトに携わるソフトウェア開発者。 このチュートリアルでは、C# での差別化ユニオンの実装方法と、C# での差別化ユニオンの実際の使用例について説明します。IronPDFライブラリ.
簡単に言うと、識別付き結合は、いくつかの定義済みの形式または値のいずれかを保持できる型です。 これは、コンパイル時に有効なケースのみが処理されることを保証しながら、異なる型や値をカプセル化するタイプセーフ構造を作成する方法を提供します。
ある操作の結果を表すシナリオを想像してください。 操作は成功し、何らかのデータを返すか、失敗し、エラーメッセージを返します。 識別付き結合を使用すると、これらの2つの可能な結果を1つの型で表すことができます。
以下は、クラス構造を使用して、C#で差別結合をシミュレートする方法の例です:
public abstract class OperationResult<T>
{
private OperationResult() { }
public sealed class Success : OperationResult<T>
{
public T Value { get; }
public Success(T value) => Value = value;
public override string ToString() => $"Success: {Value}";
}
public sealed class Failure : OperationResult<T>
{
public string Error { get; }
public Failure(string error) => Error = error;
public override string ToString() => $"Failure: {Error}";
}
public static OperationResult<T> CreateSuccess(T value) => new Success(value);
public static OperationResult<T> CreateFailure(string error) => new Failure(error);
}
public abstract class OperationResult<T>
{
private OperationResult() { }
public sealed class Success : OperationResult<T>
{
public T Value { get; }
public Success(T value) => Value = value;
public override string ToString() => $"Success: {Value}";
}
public sealed class Failure : OperationResult<T>
{
public string Error { get; }
public Failure(string error) => Error = error;
public override string ToString() => $"Failure: {Error}";
}
public static OperationResult<T> CreateSuccess(T value) => new Success(value);
public static OperationResult<T> CreateFailure(string error) => new Failure(error);
}
この例では、OperationResult
C#は強力なパターンマッチング機能を備えており、差別化された組合わせでうまく機能します。 OperationResultを拡張してみましょう。
public string HandleResult(OperationResult<int> result) =>
result switch
{
OperationResult<int>.Success success => $"Operation succeeded with value: {success.Value}",
OperationResult<int>.Failure failure => $"Operation failed with error: {failure.Error}",
_ => throw new InvalidOperationException("Unexpected result type")
};
public string HandleResult(OperationResult<int> result) =>
result switch
{
OperationResult<int>.Success success => $"Operation succeeded with value: {success.Value}",
OperationResult<int>.Failure failure => $"Operation failed with error: {failure.Error}",
_ => throw new InvalidOperationException("Unexpected result type")
};
ここでのswitch式は、OperationResultのSuccessとFailureの両方のケースを処理します。
あなたは、拡張メソッドを使用して、差別化ユニオンの機能を拡張することができます。 たとえば、OperationResultの拡張メソッドを作成してみましょう。
public static class OperationResultExtensions
{
public static bool IsSuccess<T>(this OperationResult<T> result) =>
result is OperationResult<T>.Success;
}
public static class OperationResultExtensions
{
public static bool IsSuccess<T>(this OperationResult<T> result) =>
result is OperationResult<T>.Success;
}
この public static bool メソッドは、結果が Success ケースのインスタンスであるかどうかをチェックします。
C#は、他の言語のような差別的結合をネイティブでサポートしていませんが、そのような機能を追加することについてコミュニティで継続的に議論されています。 ネイティブの差別化ユニオンは、クラス階層に依存することなく、ユニオン型の定義と作業を容易にします。
識別組合の主な利点の1つは、安全性のタイプです。コンパイル時にすべての可能なケースを知ることができるので、コンパイラーはすべてのケースを処理するように強制することができます。 これにより、実行時のエラーが減り、エラーが発生しにくいコードになります。
例えば、switch文の中で特定のcaseを処理し忘れた場合、コンパイラはエラーを出し、足りないcaseに対処するよう促します。 これは、複数のケースが考えられる複雑なデータ構造を扱う場合に特に役立ちます。
IronPDFは開発者を支援するC# PDFライブラリです。HTMLからPDFファイルを作成また、手間をかけずにPDFファイルを変更できるようにします。 C#でPDFを扱う場合、IronPDFを差別化ユニオンと統合することで、PDFファイルを生成または処理する際に異なるシナリオを扱うことができます。 例えば、PDFの生成に成功したり、エラーが発生したりするプロセスがあるとします。 差別化ユニオンを使用すると、このプロセスを明確にモデル化できます。 IronPDFを使ってPDFを生成し、その結果を判別された結合として返す簡単な例を作ってみましょう。
using IronPdf;
using System;
public abstract class PdfResult
{
private PdfResult() { }
public sealed class Success : PdfResult
{
public PdfDocument Pdf { get; }
public Success(PdfDocument pdf) => Pdf = pdf;
public override string ToString() => "PDF generation succeeded";
}
public sealed class Failure : PdfResult
{
public string ErrorMessage { get; }
public Failure(string errorMessage) => ErrorMessage = errorMessage;
public override string ToString() => $"PDF generation failed: {ErrorMessage}";
}
public static PdfResult CreateSuccess(PdfDocument pdf) => new Success(pdf);
public static PdfResult CreateFailure(string errorMessage) => new Failure(errorMessage);
}
public class PdfGenerator
{
public PdfResult GeneratePdf(string htmlContent)
{
try
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
return PdfResult.CreateSuccess(pdf);
}
catch (Exception ex)
{
return PdfResult.CreateFailure(ex.Message);
}
}
}
using IronPdf;
using System;
public abstract class PdfResult
{
private PdfResult() { }
public sealed class Success : PdfResult
{
public PdfDocument Pdf { get; }
public Success(PdfDocument pdf) => Pdf = pdf;
public override string ToString() => "PDF generation succeeded";
}
public sealed class Failure : PdfResult
{
public string ErrorMessage { get; }
public Failure(string errorMessage) => ErrorMessage = errorMessage;
public override string ToString() => $"PDF generation failed: {ErrorMessage}";
}
public static PdfResult CreateSuccess(PdfDocument pdf) => new Success(pdf);
public static PdfResult CreateFailure(string errorMessage) => new Failure(errorMessage);
}
public class PdfGenerator
{
public PdfResult GeneratePdf(string htmlContent)
{
try
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
return PdfResult.CreateSuccess(pdf);
}
catch (Exception ex)
{
return PdfResult.CreateFailure(ex.Message);
}
}
}
PdfResultクラスは、2つのケースを持つ差別結合を表します:成功と失敗です。 成功ケースには PdfDocument が含まれ、失敗ケースにはエラーメッセージが含まれます。 GeneratePdfメソッドはHTML文字列を受け取り、IronPDFを使ってPDFを生成し、その結果をPdfResultとして返します。 PDF生成に成功した場合、生成されたPDFとともにSuccessケースを返します。 例外が発生した場合は、エラーメッセージとともにFailure caseを返します。
C#の弁別結合は、複数の可能なケースを持つデータをモデル化するための強力で柔軟な方法を提供します。 C#は識別付き結合をサポートしていませんが、クラス階層やパターンマッチング、その他のテクニックを使ってシミュレートすることができます。 その結果、より型安全で、エラーが少なく、保守しやすいコードになります。
IronPDFは、無料試用初期費用をかけずにソフトウェアの感触をつかむことができるようにします。 すべての機能を調べ、あなたのニーズとどのように一致するかを確認することができます。 トライアル終了後、ライセンスは $749 から購入可能です。