C#の実引数と、仮引数の関係はJavaに準じているが(参照値渡し)refキーワードを用いることで参照渡しを実現できる。
using System;
using System.Collections.Generic;
namespace DicLesson
{
class MainClass
{
public static void Main(string[] args)
{
int x = 10;
Fuga(x);
Console.WriteLine("main:x=" + x);
FugaRef(ref x);
Console.WriteLine("main:x=" + x);
int[] arr = { 200, 300 };
Hoge(arr);
Console.WriteLine("main:arr[0]=" + arr[0]);
HogeRef(ref arr);
Console.WriteLine("main:arr[0]=" + arr[0]);
int[] arr2;
//hogeRefの中で配列が割り当てられることがわかっていても初期化は必須
//なので以下はエラー
//HogeRef(ref arr2);
//outを利用
HogeOut(out arr2);
Console.WriteLine(arr2[0]);//3
//outは事前の宣言すら不要
HogeOut(out int[] arr3);
Console.WriteLine(arr3[1]);
}
//値渡し
public static void Fuga(int num)
{
num = num * 2;
Console.WriteLine("inFuga:num=" + num);
}
public static void FugaRef(ref int num)
{
num = num * 2;
Console.WriteLine("inFugaRef:num=" + num);
}
//参照値渡し(参照型)
public static void Hoge(int[] arr)
{
arr = new int[] { 3, 4, 5 };
Console.WriteLine("inHoge:arr[0]=" + arr[0]);
}
//参照渡し(参照型)
public static void HogeRef(ref int[] arr)
{
arr = new int[] { 3, 4, 5 };
Console.WriteLine("inHogeRef:arr[0]=" + arr[0]);
}
//out
public static void HogeOut(out int[] arr)
{
arr = new int[] { 3, 4, 5 };
Console.WriteLine("inHogeOut:arr[0]=" + arr[0]);
}
}
}
このようにrefキーワードを用い参照渡しをすれば値を書き換えることができる。しかし以下のような問題もある。
1.ref引数に渡すには事前の初期化が必要
2.メソッドの中でref引数に値が渡されなくてもエラーにならない
メソッドの中で値を割り付けることがわかっている場合には1の処理は無駄となる。
そこでメソッドの中で値を割り付けることがわかっている場合はout キーワードを用いるとよい。
out キーワードを用いることにより初期化は不要となり、メソッド内で値の割付を行わなかった場合はコンパイルエラーとなる。
Q
outキーワードを用いて、int型の配列を受け取り、その中の最小値と最大値を変数に割り付けるメソッド作成し。
以下の処理を実現せよ。
整数をカンマ区切りで入力してください。
3,1,5,7,10[enter]
最小値1,最大値10
using System;
using System.Collections.Generic;
using System.Linq;
namespace DicLesson
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("整数をカンマ区切りで入力してください。");
/*LINQを使うと超すっきり
var data = Console.ReadLine().Split(',').Select(int.Parse).ToArray();
*/
var strArr = Console.ReadLine().Split(',');
var data = new int[strArr.Length];
for (int i = 0; i < strArr.Length;i++){
data[i] = int.Parse(strArr[i]);
}
GetMinMax(data, out int minVal, out int maxVal);
Console.WriteLine($"最小値{minVal},最大値{maxVal}");
}
public static void GetMinMax(int[] arr,out int min,out int max){
min = arr[0];
max = arr[0];
foreach(var n in arr){
if(n<min){
min = n;
}
if(n>max){
max = n;
}
}
}
}
}

コメント