.NET ヘルプ

C# 部分クラス(開発者向けの仕組み)

公開済み 2024年4月29日
共有:

C# では、大規模プロジェクトにおけるコードの整理と管理を強化するためのユニークな機能として partial キーワードクラスが提供されています。 この機能は、partial 修飾子を通じてアクセスでき、開発者がクラス、インターフェース、または構造体の定義を複数のファイルに分割することを可能にします。 この機能は、カスタムビジネスロジックに加えて、ユーザーインターフェースコントロール定義やサービスラッパーコードなど、すでに生成されたソースコードを扱う際に特に有益です。 この記事では、部分クラスとその利用法について学びます。IronPDF PDFライブラリ for .NETVisual Studio を使用しています。

パーシャルクラスの理解

同じアクセス レベルを維持する部分クラスは、C#でpartial修飾子を使用して定義されており、クラス定義が同じアセンブリ内の複数のファイルに分かれていることを示しています。 関連するコードをまとめて保持しながら、関心の分離を維持するこのアプローチ。 たとえば、部分クラスEmployee のビジネスロジックが1つのファイルにあり、データアクセス層が別のファイルにあるかもしれませんが、両方の部分は単一のクラスにコンパイルされます。 この分離はコードをより管理しやすくするだけでなく、複数の開発者が同じクラスで衝突なく作業できるようにします。

// File 1: Employee_BusinessLogic.cs
public partial class Employee
{
    public void CalculatePay() { /* Implementation */ }
}
// File 2: Employee_DataAccess.cs
public partial class Employee
{
    public void Load() { /* Implementation */ }
}
// File 1: Employee_BusinessLogic.cs
public partial class Employee
{
    public void CalculatePay() { /* Implementation */ }
}
// File 2: Employee_DataAccess.cs
public partial class Employee
{
    public void Load() { /* Implementation */ }
}
' File 1: Employee_BusinessLogic.cs
Partial Public Class Employee
	Public Sub CalculatePay()
	End Sub
End Class
' File 2: Employee_DataAccess.cs
Partial Public Class Employee
	Public Sub Load()
	End Sub
End Class
VB   C#

パーシャル メソッドの活用

部分クラスは部分メソッドも定義することができ、これらはオプションであるか、抽象として宣言することも可能で、より柔軟な実装戦略を可能にします。 これらのメソッドは、クラスの一部がメソッドを宣言し、その実装を行わない一方で、クラスの別の部分がそのメソッドを実装するという興味深いシナリオを可能にします。 実装が提供されない場合、部分メソッド呼び出しはコンパイル時に削除されるため、パフォーマンスの低下はありません。

// File 1: Employee_BusinessLogic.cs
public partial class Employee
{
    partial void OnPayCalculated(double amount);
    public void CalculatePay()
    {
        double amount = 1000; // Simplified calculation
        OnPayCalculated(amount);
    }
}
// File 2: Employee_Events.cs
public partial class Employee
{
    partial void OnPayCalculated(double amount)
    {
        Console.WriteLine($"Pay calculated: {amount}");
    }
}
// File 1: Employee_BusinessLogic.cs
public partial class Employee
{
    partial void OnPayCalculated(double amount);
    public void CalculatePay()
    {
        double amount = 1000; // Simplified calculation
        OnPayCalculated(amount);
    }
}
// File 2: Employee_Events.cs
public partial class Employee
{
    partial void OnPayCalculated(double amount)
    {
        Console.WriteLine($"Pay calculated: {amount}");
    }
}
' File 1: Employee_BusinessLogic.cs
Partial Public Class Employee
	Partial Private Sub OnPayCalculated(ByVal amount As Double)
	End Sub
	Public Sub CalculatePay()
		Dim amount As Double = 1000 ' Simplified calculation
		OnPayCalculated(amount)
	End Sub
End Class
' File 2: Employee_Events.cs
Partial Public Class Employee
	Private Sub OnPayCalculated(ByVal amount As Double)
		Console.WriteLine($"Pay calculated: {amount}")
	End Sub
End Class
VB   C#

部分メソッドの高度な使用方法

部分メソッドは、部分定義アプローチを具現化するもので、部分クラス内の特別な機能です。これにより、部分クラスのある部分で宣言され、別の部分でオプションの実装が可能になります。 この機能は、生成されたコードにフックを提供し、開発者がオプションで実装できるようにするために特に便利です。 「partial」キーワードはここで重要です。これはメソッドが実装を持つかもしれないし、持たないかもしれないことを示しています。

ユーザーインターフェースコントロールが読み込まれる前に、UIコンポーネントが何らかのアクションを実行する必要がある例を考えてみてください。 部分メソッドは、自動生成されたコードを乱雑にすることなくカスタムビジネスロジックを挿入するためのクリーンな方法を提供します。

// File: UIControls_AutoGenerated.cs
public partial class UIControls
{
    partial void OnControlLoading();
    public void LoadControl()
    {
        OnControlLoading();
        // Auto-generated loading logic here
    }
}
// File: UIControls_CustomLogic.cs
public partial class UIControls
{
    partial void OnControlLoading()
    {
        // Custom business logic code here
        Console.WriteLine("Custom control loading logic executed.");
    }
}
// File: UIControls_AutoGenerated.cs
public partial class UIControls
{
    partial void OnControlLoading();
    public void LoadControl()
    {
        OnControlLoading();
        // Auto-generated loading logic here
    }
}
// File: UIControls_CustomLogic.cs
public partial class UIControls
{
    partial void OnControlLoading()
    {
        // Custom business logic code here
        Console.WriteLine("Custom control loading logic executed.");
    }
}
' File: UIControls_AutoGenerated.cs
Partial Public Class UIControls
	Partial Private Sub OnControlLoading()
	End Sub
	Public Sub LoadControl()
		OnControlLoading()
		' Auto-generated loading logic here
	End Sub
End Class
' File: UIControls_CustomLogic.cs
Partial Public Class UIControls
	Private Sub OnControlLoading()
		' Custom business logic code here
		Console.WriteLine("Custom control loading logic executed.")
	End Sub
End Class
VB   C#

ビジネスロジックを部分クラスと統合する

ビジネスロジックは、特に複雑な規則や動作を持つアプリケーションでは、自動的に生成されるもの以上の修正と拡張が必要となることが多い。 部分クラスは、自動生成されたUIやデータアクセスコードを変更せずに、ビジネスロジックを別のソースファイルに含めるためのシームレスな方法を提供します。 この分離により、ビジネスロジックが開発者によって容易にアクセスおよび変更可能になり、特に複数の開発者がプロジェクトに取り組んでいる場合に、コラボレーションが向上します。

// File: Employee_AutoGenerated.cs
public partial class Employee
{
    // Auto-generated properties and methods
}
// File: Employee_BusinessLogic.cs
public partial class Employee
{
    public void Promote()
    {
        // Business logic code to promote an employee
        Console.WriteLine("Employee promoted.");
    }
}
// File: Employee_AutoGenerated.cs
public partial class Employee
{
    // Auto-generated properties and methods
}
// File: Employee_BusinessLogic.cs
public partial class Employee
{
    public void Promote()
    {
        // Business logic code to promote an employee
        Console.WriteLine("Employee promoted.");
    }
}
' File: Employee_AutoGenerated.cs
Partial Public Class Employee
	' Auto-generated properties and methods
End Class
' File: Employee_BusinessLogic.cs
Partial Public Class Employee
	Public Sub Promote()
		' Business logic code to promote an employee
		Console.WriteLine("Employee promoted.")
	End Sub
End Class
VB   C#

部分型のネスト

ネストされた部分型は、ネストされたクラスに部分クラスの概念を拡張し、ネストされたクラスの部分を別々のファイルに定義することを可能にします。 これは、大規模なネスト構造を整理する際に特に有用です。例えば、複雑なユーザインタフェースコントロール定義で、コントロールのさまざまな動作側面を処理するために複数のネストされた型を含む場合などです。

// File: ComplexControl_Part1.cs
public partial class ComplexControl
{
    public partial class NestedControl
    {
        public void Initialize() { /* Initialization code here */ }
    }
}
// File: ComplexControl_Part2.cs
public partial class ComplexControl
{
    public partial class NestedControl
    {
        public void Cleanup() { /* Cleanup code here */ }
    }
}
// File: ComplexControl_Part1.cs
public partial class ComplexControl
{
    public partial class NestedControl
    {
        public void Initialize() { /* Initialization code here */ }
    }
}
// File: ComplexControl_Part2.cs
public partial class ComplexControl
{
    public partial class NestedControl
    {
        public void Cleanup() { /* Cleanup code here */ }
    }
}
' File: ComplexControl_Part1.cs
Partial Public Class ComplexControl
	Partial Public Class NestedControl
		Public Sub Initialize()
		End Sub
	End Class
End Class
' File: ComplexControl_Part2.cs
Partial Public Class ComplexControl
	Partial Public Class NestedControl
		Public Sub Cleanup()
		End Sub
	End Class
End Class
VB   C#

実用的なアプリケーション

Partialクラスは、特にVisual StudioがWindows Formsを作成するような、フォームに関連する自動生成されたソースコードが含まれるシナリオで非常に有益です。 このセットアップにより、開発者はUIデザインコードを個別のソースファイルに分離することができ、元のUIデザインに影響を与えずにクラスを拡張または変更することができます。

Webアプリケーションでは、部分クラスにより生成されたWebサービスラッパーコードとカスタムビジネスロジックを分離することができ、Webサービスの更新がカスタム変更を上書きしないようにします。 同様に、LINQ to SQLを使用しているアプリケーションでは、dbmlファイルが部分クラス定義を生成し、自動生成されたコードに手を加えることなく追加の機能やビジネスロジックを含めるように拡張することができます。

// Auto-generated UI class
public partial class MainForm : Form
{
    // Designer code
}
// Custom logic for MainForm
public partial class MainForm
{
    // Custom event handlers and methods
}
// Auto-generated UI class
public partial class MainForm : Form
{
    // Designer code
}
// Custom logic for MainForm
public partial class MainForm
{
    // Custom event handlers and methods
}
' Auto-generated UI class
Partial Public Class MainForm
	Inherits Form

	' Designer code
End Class
' Custom logic for MainForm
Partial Public Class MainForm
	Inherits Form

	' Custom event handlers and methods
End Class
VB   C#

IronPDF: C# PDFライブラリ

C#部分的 (開発者向けの仕組み): 図1 - IronPDF

IronPDFは、開発者がアプリケーション内でPDFドキュメントを作成、読み取り、編集できるようにする、.NETのための包括的なライブラリです。 それはシンプルなアプローチを提供しますIronPDFを使ってHTMLからPDFを生成する, URL、画像、ASPX、テキストを含めることができ、レポート作成、文書生成、ウェブコンテンツのアーカイブに多用途に使用できます。 IronPDFは使いやすさに優れており、C#で開発されたアプリケーションを含むあらゆる.NETプロジェクトに統合するためのセットアップが最小限で済みます。

部分クラスとの統合によるIronPDFの活用

IronPDFを部分クラスと統合する例を示すために、PDF形式でレポートを生成するWebアプリケーションを考えてみましょう。 ビジネスロジックとPDF生成ロジックを分離するために、機能を部分クラスファイルに分割します。

IronPDFの設定

まず、プロジェクトにIronPDFを追加してください。 これは通常、NuGetパッケージマネージャーのコマンドを使用して行います:

Install-Package IronPdf

レポート作成のためのパーシャルクラスの作成

私たちのクラスを2つの部分に分けます:1つはレポートデータに関連するビジネスロジック用、もう1つはIronPDFを使用したPDF生成用です。

ファイル1:ReportGenerator_BusinessLogic.cs

このファイルには、レポート用のデータを準備するビジネスロジックが含まれています。

public partial class ReportGenerator
{
    public IEnumerable<string> GetDataForReport()
    {
        // Imagine this method fetches and prepares data for the report
        return new List<string> { "Data1", "Data2", "Data3" };
    }
}
public partial class ReportGenerator
{
    public IEnumerable<string> GetDataForReport()
    {
        // Imagine this method fetches and prepares data for the report
        return new List<string> { "Data1", "Data2", "Data3" };
    }
}
Partial Public Class ReportGenerator
	Public Function GetDataForReport() As IEnumerable(Of String)
		' Imagine this method fetches and prepares data for the report
		Return New List(Of String) From {"Data1", "Data2", "Data3"}
	End Function
End Class
VB   C#

ファイル2: ReportGenerator_PdfGeneration.cs

このファイルは、準備されたデータからPDFレポートを生成するためにIronPDFを使用しています。

public partial class ReportGenerator
{
    public void GeneratePdfReport()
    {
        var renderer = new IronPdf.ChromePdfRenderer();
        var data = GetDataForReport();
        var htmlContent = $"<html><body><h1>Report</h1><p>{string.Join("</p><p>", data)}</p></body></html>";
        // Generate PDF from HTML string
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        // Save the PDF to a file
        pdf.SaveAs("Report.pdf");
        Console.WriteLine("Report generated successfully.");
    }
}
public partial class ReportGenerator
{
    public void GeneratePdfReport()
    {
        var renderer = new IronPdf.ChromePdfRenderer();
        var data = GetDataForReport();
        var htmlContent = $"<html><body><h1>Report</h1><p>{string.Join("</p><p>", data)}</p></body></html>";
        // Generate PDF from HTML string
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        // Save the PDF to a file
        pdf.SaveAs("Report.pdf");
        Console.WriteLine("Report generated successfully.");
    }
}
Partial Public Class ReportGenerator
	Public Sub GeneratePdfReport()
		Dim renderer = New IronPdf.ChromePdfRenderer()
		Dim data = GetDataForReport()
		Dim htmlContent = $"<html><body><h1>Report</h1><p>{String.Join("</p><p>", data)}</p></body></html>"
		' Generate PDF from HTML string
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
		' Save the PDF to a file
		pdf.SaveAs("Report.pdf")
		Console.WriteLine("Report generated successfully.")
	End Sub
End Class
VB   C#

使用方法

クラスの一部を設定することで、PDFレポートの生成はReportGeneratorクラスのインスタンスでGeneratePdfReportメソッドを呼び出すだけのことになります。

var reportGenerator = new ReportGenerator();
reportGenerator.GeneratePdfReport();
var reportGenerator = new ReportGenerator();
reportGenerator.GeneratePdfReport();
Dim reportGenerator As New ReportGenerator()
reportGenerator.GeneratePdfReport()
VB   C#

C#部分 (開発者向けの作動方法): 図2 - PDFレポート出力

結論

C# 部分 (開発者向けの仕組み): 図3 - ライセンス

C#における部分クラス、部分メソッド、およびネストされた部分型の使用は、コードの整理や管理において開発者に柔軟かつ強力なツールを提供します。 自動生成されたコードをビジネスロジック、ユーザーインターフェイス制御定義、およびアプリケーションの他の部分から分離することにより、開発者はより保守性、可読性、およびスケーラビリティの高いアプリケーションを作成できます。

ビジネスロジックとPDF処理の関心事を分離することで、開発者はより良いコードの組織化、保守性、およびスケーラビリティを実現することができます。 IronPDFの強力な機能と部分クラスの組織的な利点を組み合わせることにより、PDFを扱う.NET開発者にとって強力なツールセットが提供されます。 無料でIronPDFをお試しいただけます。IronPDF 無料トライアル. 購入に興味がある場合、IronPDFのライセンスは$749から始まります。

< 以前
Npgsql C# (開発者向けの仕組み)
次へ >
C# 仮想と抽象(開発者向けの使い方)