C#の配列型におけるrefパラメータ(参照渡し)の使い方を解説
C#のrefパラメータ(参照渡し)とは?
C#では、refキーワードを使うことで、引数を「参照渡し」でメソッドに渡すことができます。参照パラメータとは、変数が格納されているメモリ上の場所への参照のことです。値渡しの場合とは異なり、refを使って引数を渡すと、新しいストレージ領域は作成されません。そのため、メソッド内での変更が呼び出し元の変数に直接反映されます。
refパラメータの宣言方法
通常の変数をrefパラメータとして宣言する例は以下の通りです。
public void swap(ref int x, ref int y) {}配列型の変数をrefパラメータとして宣言する場合は、次のように記述します。
static void Display(ref int[] myArr)
配列型のrefパラメータを使用したサンプルコード
以下は、C#で配列型のrefパラメータを扱う方法を示す完全なサンプルコードです。
class TestRef {
static void Display(ref int[] myArr) {
// 配列がnullの場合、新しい配列を作成して割り当てる
if (myArr == null) {
myArr = new int[10];
}
myArr[0] = 345;
myArr[1] = 755;
myArr[2] = 231;
}
static void Main() {
int[] arr = { 98, 12, 65, 45, 90, 34, 77 };
// refキーワードを使って配列を参照渡しする
Display(ref arr);
for (int i = 0; i < arr.Length; i++) {
System.Console.Write(arr[i] + " ");
}
System.Console.ReadKey();
}
}実行結果
345 755 231 45 90 34 77
解説のポイント
このサンプルコードには、refパラメータの重要な特徴が表れています。
まず、Mainメソッド内で7つの要素を持つ配列arrを作成し、Displayメソッドにrefキーワード付きで渡しています。ここで注目すべきは、Displayメソッド内のnullチェックです。もし渡された配列がnullだった場合、メソッド内で新しい配列(要素数10)を生成して代入しています。
これは値渡しでは不可能な動作です。通常の値渡しでは、メソッド内で引数に新しいオブジェクトを代入しても、それは呼び出し元には影響しません。しかしrefを使った参照渡しでは、メソッド内で行われた再代入や要素の変更がすべて呼び出し元の変数に反映されます。
その結果、このプログラムを実行すると、最初の3つの要素が345、755、231に書き換えられ、残りの4つの要素は元の値(45、90、34、77)のまま出力されます。
refとoutの違い
補足として、C#には似た機能を持つoutキーワードもあります。refは「呼び出し前に必ず初期化されている」必要があるのに対し、outは「メソッド内で必ず値を代入する」ことが前提となっています。既存の値を読み取りつつ変更したい場合はrefを、メソッドから複数の戻り値を受け取りたい場合はoutを使うのが一般的です。
-
C#の型キャストとは?暗黙的・明示的な型変換の基本を解説
C#の型キャスト(型変換)とは型キャスト(型変換)とは、あるデータ型の値を別のデータ型へ変換する操作のことです。C#では、主に以下の2つの方法で型変換を行います。暗黙的な型変換(Implicit Conversion)暗黙的な型変換は、C#が自動的に、かつ型安全な形で実行してくれる変換です。たとえば、小さい整数型から大きい整数型への変換(intからlongなど)や、派生クラスから基底クラスへの変換がこれに該当します。プログラマーが特別な記述をする必要はありません。明示的な型変換(Explicit Conversion)明示的な型変換は、開発者がキャスト演算子「( )」などの事前定義された機能を
-
C#のデータ型とは?値型・参照型・ポインタ型の違いを徹底解説
C#のデータ型は、大きく分けて「値型(Value Type)」「参照型(Reference Type)」「ポインタ型(Pointer Type)」の3種類に分類されます。それぞれの仕組みと使い分けを理解することは、C#プログラミングの基礎として非常に重要です。本記事では、各データ型の特徴を一覧表付きでわかりやすく解説します。 値型(Value Types) 値型の変数には、データそのものが直接代入されます。すべての値型は System.ValueType クラスから派生しており、変数を別の変数に代入すると値がコピーされるため、元の変数には影響しません。 C#で利用できる主な値型は以下のとおりで