.NET ヘルプ

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

更新済み 11月 13, 2023
共有:

について C#のrefキーワード は、すべての初心者が学ぶべき重要なツールです。 呼び出し元のメソッドで参照型変数に行われた変更がその外部にも反映されるように、引数やargsを値渡しではなく参照渡しで渡すために使用されます。 このチュートリアルでは、**ref キーワードの詳細を説明し、それがどのように機能するかを示すさまざまなコンソールコードの例を紹介します。

ref キーワードの紹介

C# でメソッドのパラメータを渡す場合、デフォルトでは値渡しになります。 これは、パラメーターの値のコピーが作成され、呼び出し元のメソッド内で行われた変更が、メソッド外の元の変数に影響を与えないことを意味します。 ref キーワードはこの動作を変更し、パラメータを参照渡しすることを可能にします。 パラメータが参照渡しで渡される場合、メソッド内で行われた変更はメソッド外の元の変数に直接影響を与えます。

主要な概念

  • ref キーワード: 変数が参照渡しで渡されることを示すために使用されます。
  • 参照変数:データが格納されているメモリ位置を参照する型。
  • 値型: 実際のデータを保持する型。
  • オリジナル変数: ref キーワードを使用することで、メソッドの内部で行われた変更を反映するメソッド外の変数。

参照渡し

まず、変数が参照渡しされる概念を理解しましょう。 次のコードに示されているように、整数をインクリメントするメソッドがあると想像してください:

class Program
{
//method returns incremented value
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  // Output: 5
    }
}
class Program
{
//method returns incremented value
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  // Output: 5
    }
}
Friend Class Program
'method returns incremented value
	Private Shared Sub IncrementByOne(ByVal num As Integer)
		num += 1
	End Sub

	Shared Sub Main()
		Dim value As Integer = 5
		IncrementByOne(value)
		Console.WriteLine(value) ' Output: 5
	End Sub
End Class
VB   C#

上記のコードでは、IncrementByOneメソッド内でnumをインクリメントしたにもかかわらず、元のvalueは変更されません。 これは、numが元の変数のコピーであり、変更を加えても元の変数には影響しないためです。

ref キーワードの使用

では、「ref」キーワードがこの動作をどのように変更するか見てみましょう。 次のコード例の1つに示されているように、refを使用することで、変数を参照渡しでメソッドに渡すことができます。

class Program
{
//ref int
    static void IncrementByOneRef(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOneRef(ref value);
        Console.WriteLine(value);  // Output: 6
    }
}
class Program
{
//ref int
    static void IncrementByOneRef(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOneRef(ref value);
        Console.WriteLine(value);  // Output: 6
    }
}
Friend Class Program
'ref int
	Private Shared Sub IncrementByOneRef(ByRef num As Integer)
		num += 1
	End Sub

	Shared Sub Main()
		Dim value As Integer = 5
		IncrementByOneRef(value)
		Console.WriteLine(value) ' Output: 6
	End Sub
End Class
VB   C#

メソッドシグネチャと呼び出しの両方に ref キーワードがあることに注意してください。 これはC#に value 変数を参照渡ししたいことを伝えます。 その結果、IncrementByOneRef メソッド内で行われた変更は、元の value 変数に反映されます。

値型を扱う

ref キーワードは、整数、二重精度変数、および構造体のような型を扱う際に特に便利です。 これらの型は直接メモリに格納され、参照渡しすることでパフォーマンスの向上とデータ操作に対するより正確な制御が可能になります。

参照変数の修正

ref キーワードは通常、値型と関連していますが、参照型変数にも使用できます。 参照型(例えばクラスや配列)は、データ自体ではなく、メモリ内の実際のデータへの参照を格納します。 これはポインターのような構造を扱っていることを意味しており、次の例に示すように、参照渡しによって異なる結果が得られる可能性があります:

class Person
{
    public string Name { get; set; }
}

class Program
{
    //method
    static void ChangeName(ref Person person)
    {
        //new object
        person = new Person { Name = "Alice" };
    }

    static void Main()
    {
        Person person = new Person { Name = "Bob" };
        ChangeName(ref person);
        Console.WriteLine(person.Name);  // Output: Alice
    }
}
class Person
{
    public string Name { get; set; }
}

class Program
{
    //method
    static void ChangeName(ref Person person)
    {
        //new object
        person = new Person { Name = "Alice" };
    }

    static void Main()
    {
        Person person = new Person { Name = "Bob" };
        ChangeName(ref person);
        Console.WriteLine(person.Name);  // Output: Alice
    }
}
Friend Class Person
	Public Property Name() As String
End Class

Friend Class Program
	'method
	Private Shared Sub ChangeName(ByRef person As Person)
		'new object
		person = New Person With {.Name = "Alice"}
	End Sub

	Shared Sub Main()
		Dim person As New Person With {.Name = "Bob"}
		ChangeName(person)
		Console.WriteLine(person.Name) ' Output: Alice
	End Sub
End Class
VB   C#

この例では、ChangeName メソッドは person 変数の参照を新しい Person オブジェクトに変更します。 その結果、元のperson変数は別のオブジェクトを指しており、その名前は「Alice」です。

リファレンスタイプパラメータを使ったメソッドのオーバーロード

同じ名前でも異なるパラメータを持つ複数のメソッドを作成できます。 これはメソッドのオーバーロードと呼ばれます。 ref キーワードを使用すると、メソッドのオーバーロードがより強力になります。

class Calculator
{
    public static void Add(ref int x, int y)
    {
        x += y;
    }

    public static void Add(ref double x, double y)
    {
        x += y;
    }
}

class Program
{
    static void Main()
    {
        int intValue = 5;
        double doubleValue = 7.5;
        //ref parameter
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      // Output: 8
        Console.WriteLine(doubleValue);   // Output: 10.0
    }
}
class Calculator
{
    public static void Add(ref int x, int y)
    {
        x += y;
    }

    public static void Add(ref double x, double y)
    {
        x += y;
    }
}

class Program
{
    static void Main()
    {
        int intValue = 5;
        double doubleValue = 7.5;
        //ref parameter
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      // Output: 8
        Console.WriteLine(doubleValue);   // Output: 10.0
    }
}
Friend Class Calculator
	Public Shared Sub Add(ByRef x As Integer, ByVal y As Integer)
		x += y
	End Sub

	Public Shared Sub Add(ByRef x As Double, ByVal y As Double)
		x += y
	End Sub
End Class

Friend Class Program
	Shared Sub Main()
		Dim intValue As Integer = 5
		Dim doubleValue As Double = 7.5
		'ref parameter
		Calculator.Add(intValue, 3)
		Calculator.Add(doubleValue, 2.5)

		Console.WriteLine(intValue) ' Output: 8
		Console.WriteLine(doubleValue) ' Output: 10.0
	End Sub
End Class
VB   C#

上記の例では、Add メソッドをオーバーロードして、int 型と double 型の両方で動作するようにしています。ref キーワードは、メソッドが元の変数を直接修正できるようにします。

アウト キーワードの使用

もう一つの関連キーワードは「out」です。 それは ref と似ていますが、少し異なる目的を持っています。 ref は変数が渡される前に初期化されることを期待しますが、out キーワードは、初期値を持たないパラメーターに対してメソッドが値を割り当てる場合に使用されます。

class Program
{
    static void Divide(int dividend, int divisor, out int quotient)
    {
        quotient = dividend / divisor;
    }

    static void Main()
    {
        int result;
        Divide(10, 2, out result);
        Console.WriteLine(result);  // Output: 5
    }
}
class Program
{
    static void Divide(int dividend, int divisor, out int quotient)
    {
        quotient = dividend / divisor;
    }

    static void Main()
    {
        int result;
        Divide(10, 2, out result);
        Console.WriteLine(result);  // Output: 5
    }
}
Friend Class Program
	Private Shared Sub Divide(ByVal dividend As Integer, ByVal divisor As Integer, ByRef quotient As Integer)
		quotient = dividend \ divisor
	End Sub

	Shared Sub Main()
		Dim result As Integer = Nothing
		Divide(10, 2, result)
		Console.WriteLine(result) ' Output: 5
	End Sub
End Class
VB   C#

この例では、Divide メソッドは商を計算し、out キーワードを使用してそれを quotient 変数に割り当てます。 resultをメソッドに渡す前に初期化する必要はないことを留意してください。

ref キーワードと out キーワードの違い

out キーワードは ref キーワードに似ていますが、実質的に異なります。 out パラメータには初期値が必要ありませんが、ref パラメータにはメソッド呼び出し前に初期値が必要です。

潜在的な落とし穴

「ref」および「out」キーワードは強力なツールですが、慎重に使用する必要があります。 これらのキーワードの誤った使用は、混乱するコードや予期しない動作につながる可能性があります。 例えば、refout パラメータで非 ref 変数を初期化せずに使用することはできません。これはコンパイルエラーにつながるためです。

ref キーワードの高度な使用方法

参照型と値型の扱い方

「ref」キーワードを使用する際に、参照型と値型の違いを理解することは非常に重要です。

  • 参照型: 変数はデータが格納されているメモリの場所を参照します。例として、オブジェクトや配列などがあります。
  • 値型: 変数が直接データを含んでいる型。例えば、整数や浮動小数点数など。

    値型に ref を使用すると、変更がメソッド外に反映されますが、参照型変数は本質的にこのように動作します。

ref キーワードを使用した拡張メソッド

拡張メソッドで ref キーワードを使うこともできます。 例:

public static class StringExtensions
{
//example
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
public static class StringExtensions
{
//example
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
Public Module StringExtensions
'example
	Public Sub AppendValue(ByRef Me input As String, ByVal value As String)
		input &= value
	End Sub
End Module
VB   C#

コンパイラエラーとrefキーワード

メソッド署名またはメソッド呼び出しに ref キーワードを含めるのを忘れると、コンパイル時にコンパイラエラーが発生します。

Asyncメソッドとrefパラメーター

イテレータメソッドやasyncメソッドではrefパラメータを使用できません。これらはパラメータを値渡しで渡す必要があります。

Iron Suiteの紹介

C#のrefキーワードのような重要な概念を理解することに加えて、開発者の生活を大幅に楽にする強力なツールのセットがあります。 Iron Suiteは、IronPDF、IronXL、IronOCR、IronBarcodeを含む強力なツールとライブラリのコレクションです。 これらのツールを探索し、どのようにしてあなたのコーディング体験を引き上げることができるかを見てみましょう。

IronPDF PDF処理が簡単に

IronPDF は Iron Suite の重要な部分です。これは開発者が C# でPDFファイルを作成、読み取り、編集することを可能にするライブラリです。 HTMLをPDFに変換したい場合、IronPDFには必要なツールがあります。 こちらをご覧ください HTML を PDF に変換するチュートリアル この機能の詳細について学ぶには。

IronXL - Excel操作が簡単に

C#でExcelファイルを扱うのは挑戦的ですが、 IronXL この作業を簡単にします。 それは、Excelをインストールせずに、Excelファイルの読み取り、書き込み、編集、および操作を可能にします。 データのインポートから新しいスプレッドシートの作成まで、「IronXL」はC#でのExcel処理を容易にします。

IronOCR 光学式文字認識 for C

光学文字認識 (OCR) (OCR (光学式文字認識)) 複雑な場合がありますが IronOCR プロセスを効率化します。 このライブラリを使用すると、画像からテキストを読み取り、それを機械で読み取れるテキストに変換することができます。 スキャンしたドキュメントからテキストを抽出する必要がある場合や、画像から文字を認識する必要がある場合、IronOCRにはその機能があります。

IronBarcode バーコード生成と読み取り

以下の文章を日本語に翻訳します:

バーコードは様々な業界で一般的に使用されており、アプリケーションでバーコードを取り扱うことがますます簡単になりました。 IronBarcode. このライブラリは、C#でバーコードを作成、読み取り、操作することができます。 IronBarcodeは、幅広いQRコードおよびバーコード形式をサポートしています。

Iron Suiteとrefキーワードの関係について

これらのツールが前述のrefキーワードとどのように関連しているのか疑問に思うかもしれません。 複雑なプロジェクトにおいて、PDF、Excel、OCR、またはバーコードを扱う場合、ref キーワードやその他のC#の原則を効果的に使用することが、コードを効率的に管理するために重要となります。

たとえば、IronXLを使用して大規模なExcelファイルを操作する際に、refキーワードを使用してオブジェクトを参照渡しすることで、コードをより効率的かつ保守的にすることができます。 同様に、refキーワードを使用する方法では、IronPDFを使用してPDFドキュメントを操作することが含まれる場合があります。

ref キーワードのようなコア言語機能を理解し、Iron Suite のようなツールにアクセスすることにより、効率的で堅牢かつ汎用的なアプリケーションを構築するための強力な組み合わせが備わります。 Iron Suiteは、既存のC#の知識とシームレスに連携するように設計されており、よりプロフェッショナルで洗練されたソリューションを作成するのに役立ちます。

結論

C#言語は、refキーワードのような機能を備え、開発者に強力な機能を提供します。 IronPDF、IronXL、IronOCR、IronBarcodeを含むIron Suiteと組み合わせることで、可能性はさらに広がります。

Iron Suiteの各製品は、 無料試用すぐに投資することなく、広範な機能を探索して活用することができます。 フルライセンスを進める決定をされる場合、個々のコンポーネントに対する料金は $749 からとなります。

Iron Suite全体があなたのニーズに合っている場合、素晴らしいお得な情報があります。 2つの個別コンポーネントの価格でフルスイートを手に入れることができます。

< 以前
C# データテーブルからリストへ (開発者向けの動作方法)
次へ >
NLog C# (開発者向けの使い方)

準備はできましたか? バージョン: 2024.9 新発売

無料のNuGetダウンロード 総ダウンロード数: 10,659,073 View Licenses >