.NET ヘルプ

C# 参照(開発者向けの動作方法)

C# では、ref キーワード は、メソッドが渡された参照型変数のパラメーター値を変更できる強力な機能です。 refの使い方を理解することで、アプリケーション内のデータを管理し操作する能力を向上させることができます。

この記事では、refキーワードの基本、適用、および異なるデータ型での使用のニュアンスについて説明します。また、PDFライブラリであるIronPDF library for .NETについても学びます。

ref パラメータの理解

ref パラメーターは、メソッドに渡された変数への参照として機能するメソッドパラメーターです。 標準の値パラメーターとは異なり、変数のコピーのみが渡されるのではなく、ref パラメーターは呼び出されたメソッドが元の変数の値を変更できるようにします。 この動作は、渡された変数の状態を更新するための方法が必要な場合に重要です。

次の例を考えてみましょう。ref の基本的な使用法を示し、参照型変数がメソッド呼び出しの間に同じオブジェクト内でパラメータの値を保持する方法に焦点を当てます。

class Program
{
    static void Main()
    {
        int number = 100;
        ModifyNumber(ref number);
        Console.WriteLine(number);
    }
    static void ModifyNumber(ref int number)
    {
        number = 200;
    }
}
class Program
{
    static void Main()
    {
        int number = 100;
        ModifyNumber(ref number);
        Console.WriteLine(number);
    }
    static void ModifyNumber(ref int number)
    {
        number = 200;
    }
}
Friend Class Program
	Shared Sub Main()
		Dim number As Integer = 100
		ModifyNumber(number)
		Console.WriteLine(number)
	End Sub
	Private Shared Sub ModifyNumber(ByRef number As Integer)
		number = 200
	End Sub
End Class
$vbLabelText   $csharpLabel

この例では、Mainメソッドが整数numberを宣言し、100に初期化します。その後、ModifyNumberを呼び出し、numberrefパラメータとして渡します。 ModifyNumberの内部で、numberの値が200に変更されます。numberは参照渡しされるため、その変更はMainメソッド内の元の値にも反映され、コンソールに200が出力されます。

ref パラメーターの仕組み

メソッドパラメーターをrefキーワードで宣言すると、そのパラメーターはコピーではなく、元の変数を参照することをコンパイラーに伝えています。 これは、実際の値ではなく、変数のメモリアドレスを渡すことによって実現されます。 呼び出されるメソッドと呼び出すメソッドは同じメモリ位置にアクセスするため、パラメータに対して行われた変更は、元の変数に直接反映されます。

ref を理解する鍵は、それが値型と参照型の両方で使用できることを認識することです。値型には整数や構造体などの単純なデータ型が含まれ、参照型にはオブジェクトや配列が含まれます。 しかし、参照型の変数は本来的にメモリアドレスを保持しているにもかかわらず、参照型と共にrefを使用することで、オブジェクトの内容だけでなく実際の参照そのものを変更することが可能になります。

ref と out の違い

両方のrefおよびoutキーワードは元の変数を変更することを可能にしますが、重要な違いがあります。 out パラメータは、メソッドに渡される前に初期化を必要としません。 逆に、ref パラメーターは渡される前に変数が初期化されている必要があります。 さらに、out パラメーターを使用するメソッドは、メソッドが戻る前に値を割り当てる義務があります。 この要件はrefパラメーターには適用されません。

次に、out キーワードの使用方法を示します:

class Program
{
    static void Main()
    {
        int result;
        CalculateResult(out result);
        Console.WriteLine(result);
    }
    static void CalculateResult(out int calculation)
    {
        calculation = 20 * 5;
    }
}
class Program
{
    static void Main()
    {
        int result;
        CalculateResult(out result);
        Console.WriteLine(result);
    }
    static void CalculateResult(out int calculation)
    {
        calculation = 20 * 5;
    }
}
Friend Class Program
	Shared Sub Main()
		Dim result As Integer = Nothing
		CalculateResult(result)
		Console.WriteLine(result)
	End Sub
	Private Shared Sub CalculateResult(ByRef calculation As Integer)
		calculation = 20 * 5
	End Sub
End Class
$vbLabelText   $csharpLabel

この場合、CalculateResult はメソッド内でcalculationを初期化し、Mainは結果を反映します。

メソッドのオーバーロードにおけるrefの実際の使用

refは、メソッドのシグネチャをrefキーワードによって変更するメソッドのオーバーロードにも使用できます。 メソッドシグネチャは、メソッド名とそのパラメーターの型で構成されています。これには、パラメーターが参照渡し(ref)、値渡し、またはoutパラメーターとして渡されるかどうかが含まれます。

ref パラメーターと値パラメーターに基づいてメソッドのオーバーロードを検討します。

class Program
{
    static void Main()
    {
        int normalParameter = 10, refParameter = 10;
        IncrementValue(normalParameter);
        IncrementValue(ref refParameter);
        Console.WriteLine($"Normal: {normalParameter}, Ref: {refParameter}");
    }
    static void IncrementValue(int number)
    {
        number++;
    }
    static void IncrementValue(ref int number)
    {
        number++;
    }
}
class Program
{
    static void Main()
    {
        int normalParameter = 10, refParameter = 10;
        IncrementValue(normalParameter);
        IncrementValue(ref refParameter);
        Console.WriteLine($"Normal: {normalParameter}, Ref: {refParameter}");
    }
    static void IncrementValue(int number)
    {
        number++;
    }
    static void IncrementValue(ref int number)
    {
        number++;
    }
}
Friend Class Program
	Shared Sub Main()
		Dim normalParameter As Integer = 10, refParameter As Integer = 10
		IncrementValue(normalParameter)
		IncrementValue(refParameter)
		Console.WriteLine($"Normal: {normalParameter}, Ref: {refParameter}")
	End Sub
'INSTANT VB TODO TASK: VB does not allow method overloads which differ only in parameter ByVal/ByRef:
'ORIGINAL LINE: static void IncrementValue(int number)
	Private Shared Sub IncrementValue(ByVal number As Integer)
		number += 1
	End Sub
'INSTANT VB TODO TASK: VB does not allow method overloads which differ only in parameter ByVal/ByRef:
'ORIGINAL LINE: static void IncrementValue(ref int number)
	Private Shared Sub IncrementValue(ByRef number As Integer)
		number += 1
	End Sub
End Class
$vbLabelText   $csharpLabel

ここで、IncrementValueは通常のパラメーターを取るバージョンとrefパラメーターを取るバージョンの2種類でオーバーロードされています。 refバージョンは元の変数をインクリメントしますが、通常のバージョンはコピーを変更するだけです。

IronPDFの紹介

C# Ref(開発者向けの仕組み):図 1

IronPDF for .NET PDF Solutionsは、PDFドキュメントを扱うために設計された包括的な.NETライブラリです。 それは主にC#で構築され、HTMLコンテンツからPDFを作成および操作することを簡単にすることに重点を置いています。 Chromeレンダリングエンジンを使用することで、IronPDFはHTML、CSS、JavaScript、画像コンテンツの細部を捉えた、高品質でピクセルパーフェクトなPDFドキュメントを提供します。

このライブラリは、多用途に使えるものであり、.NET Framework、.NET Core、および.NET Standardを含む幅広い.NET環境をサポートしているため、デスクトップからWebベースのシステムまで様々なアプリケーションに適しています。 IronPDFはPDFの作成をサポートするだけでなく、PDFの編集、セキュリティ保護、および他の形式への変換機能も提供します。

この機能には、テキストおよび画像の抽出、フォームの記入、電子署名の適用が含まれ、.NETアプリケーション内でPDFドキュメントを総合的に扱うことを保証します。

C#およびrefキーワードとのIronPDFの統合

IronPDF は C# と統合することで、参照渡しのパラメータに使用される ref キーワードを含む、この言語の強力な機能を活用できます。 この統合により、内容が実行時に決定される変数に依存する動的なPDF生成が可能になります。

IronPDFをC#に統合する際にrefキーワードを使用する例として、動的に計算された値を含むPDFレポートを生成したい場合を考えてみましょう。 この値は、ref パラメーターを受け取るメソッド内で計算され、そのメソッドでこの値が変更されることが可能となり、その結果が生成されたPDFに反映されます。

コード例: refを使用した動的コンテンツによるPDF生成

次のC#コードは、refキーワードと連携してIronPDFを使用してPDFドキュメントを生成する方法を示しています。 コードは値を計算し、それをrefパラメーターを受け付けるメソッドで修正し、その後IronPDFを使用してこの動的コンテンツを含むPDFを生成します。

using IronPdf;
using System;
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        // Initialize the value
        int totalSales = 150;
        // Modify the value within the method using 'ref'
        AddMonthlyBonus(ref totalSales);
        // Use IronPDF to generate a PDF report
        var Renderer = new ChromePdfRenderer();
        var PDF = Renderer.RenderHtmlAsPdf($"<h1>Monthly Sales Report</h1><p>Total Sales, including bonus: {totalSales}</p>");
        // Save the PDF to a file
        PDF.SaveAs("MonthlySalesReport.pdf");
        // Confirm the PDF has been generated
        Console.WriteLine("PDF generated successfully. Check your project directory.");
    }
    static void AddMonthlyBonus(ref int sales)
    {
        // Assume a bonus of 10% of the sales
        sales += (int)(sales * 0.1);
    }
}
using IronPdf;
using System;
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        // Initialize the value
        int totalSales = 150;
        // Modify the value within the method using 'ref'
        AddMonthlyBonus(ref totalSales);
        // Use IronPDF to generate a PDF report
        var Renderer = new ChromePdfRenderer();
        var PDF = Renderer.RenderHtmlAsPdf($"<h1>Monthly Sales Report</h1><p>Total Sales, including bonus: {totalSales}</p>");
        // Save the PDF to a file
        PDF.SaveAs("MonthlySalesReport.pdf");
        // Confirm the PDF has been generated
        Console.WriteLine("PDF generated successfully. Check your project directory.");
    }
    static void AddMonthlyBonus(ref int sales)
    {
        // Assume a bonus of 10% of the sales
        sales += (int)(sales * 0.1);
    }
}
Imports IronPdf
Imports System
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key"
		' Initialize the value
		Dim totalSales As Integer = 150
		' Modify the value within the method using 'ref'
		AddMonthlyBonus(totalSales)
		' Use IronPDF to generate a PDF report
		Dim Renderer = New ChromePdfRenderer()
		Dim PDF = Renderer.RenderHtmlAsPdf($"<h1>Monthly Sales Report</h1><p>Total Sales, including bonus: {totalSales}</p>")
		' Save the PDF to a file
		PDF.SaveAs("MonthlySalesReport.pdf")
		' Confirm the PDF has been generated
		Console.WriteLine("PDF generated successfully. Check your project directory.")
	End Sub
	Private Shared Sub AddMonthlyBonus(ByRef sales As Integer)
		' Assume a bonus of 10% of the sales
		sales += CInt(Math.Truncate(sales * 0.1))
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Ref(開発者向けの仕組み):図2

この例では、totalSales は 150 から始まります。AddMonthlyBonus メソッドは、ref キーワードを使用してこの値を参照として取り、10% のボーナスを計算し、元の販売額に追加します。 IronPDFは、ボーナスを含む総売上を報告するHTMLスニペットを含むPDFドキュメントを生成します。 最終的なドキュメントは「MonthlySalesReport.pdf」としてローカルに保存されます。

結論

C# 参照(開発者への働きかけ方):図 3

C#におけるrefキーワードの理解は、データがメソッド間でどのように渡されるかを管理するための価値あるツールを提供します。 メソッドが渡されたパラメーターの元の値を直接変更できるようにすることで、refはメソッドをより柔軟で強力にします。

refに慣れるにつれて、プログラミングのニーズを満たすためにいつどのように効果的に使用するかをよりよく理解できるようになります。 IronPDFは、PDF機能を始めるための無料トライアルを提供しており、価格は$749からです。

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
MS Graph .NET(開発者向けの仕組み)
次へ >
Mudblazor .NET 8(開発者向けの動作方法)