.NET ヘルプ

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

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

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

この記事では、refキーワードの基本、その応用、さまざまなデータ型で使用する場合のニュアンスについて説明します。また.NET 用 IronPDF ライブラリこれはPDFライブラリです。

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
VB   C#

この例では、Main メソッドが整数の number を宣言し、それを 100 に初期化します。そして、numberref パラメーターとして渡して ModifyNumber を呼び出します。 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
VB   C#

この場合、CalculateResult はメソッド内で計算を初期化し、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
VB   C#

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

IronPDFの紹介

C# リファレンス(開発者向けの動作方法):図1

IronPDF for .NET PDFソリューションは、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は、パラメータを参照渡しするためのrefキーワードの使用を含む、C#の強力な機能を活用するために統合することができます。 この統合により、内容が実行時に決定される変数に依存する動的なPDF生成が可能になります。

C#でrefキーワードを使用してIronPDFを統合する例を示すために、動的に計算された値を含むPDFレポートを生成するシナリオを考えてみてください。 この値は、ref パラメーターを受け取るメソッド内で計算されます。このメソッドにより値が変更され、その変更は生成されたPDFに反映されます。

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

以下のC#コードは、refキーワードを使用してPDFドキュメントを生成するために、IronPDFをどのように使用するかを示しています。 コードは値を計算し、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
VB   C#

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

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

結論

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

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

ref を使い慣れると、プログラミングのニーズを満たすために効果的に使用するタイミングと方法がより良く理解できるようになります。 IronPDFはPDF機能を始めるための無料トライアル価格は749ドルからです。

< 以前
MS Graph .NET(開発者向けの仕組み)
次へ >
Mudblazor .NET 8(開発者向けの動作方法)