スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
目次
引数の渡し方
引数の渡し方には、「値渡し」と「参照渡し」の2つのパターンがあります。
「値渡し」とは、変数の値をコピーして、メソッドに渡すことを意味します。
メソッドに渡される値はあくまでコピーなので、メソッド内でコピーの値が変わったとしても、元の値に何も影響を与えません。
「参照渡し」とは、変数の参照情報を、メソッドに渡すことを意味します。
この場合、メソッドを呼び出す側と呼び出される側で、メモリー上の同じ領域を見ていることになります。
そのため、変数の値がメソッド内で変わった場合、メソッドの呼び出した側にも、その変更は反映されます。
値渡しの例
メソッドは、「値渡し」で基本的にやり取りされます。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Normal02 { class Program { static void Main(string[] args) { int i = 10; Plus5(i); Console.WriteLine("Plus5メソッド外での値は" + i);//iの値は10のまま } static void Plus5(int i) { i += 5; Console.WriteLine("Plus5メソッド内での値は" + i); } } } |
実行結果
Plus5メソッド内での値は15
Plus5メソッド外での値は10
Plus5メソッドで、引数を通して渡された変数の値に+5します。
しかし、値が+5されるのはあくまで、コピーの値です。
元の変数iには何も影響を与えません。
参照渡しの例
参照渡しを行いたい場合は、パラメーター修飾子のrefまたはoutを使います。
ここでは、refを例に挙げます
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ref01 { class Program { static void Main(string[] args) { int i = 10;//初期化 Plus5(ref i); Console.WriteLine("Plus5メソッド外での値は" + i);//iの値は15 } static void Plus5(ref int i) { i += 5; Console.WriteLine("Plus5メソッド内での値は" + i); } } } |
実行結果
Plus5メソッド内での値は15
Plus5メソッド外での値は15
refキーワードはメソッドを呼び出す側と、メソッドの定義側の両方につける必要があります。
refとoutの違い
refキーワードを付けた変数は、メソッドを呼び出す側で、予め初期化して必要があります。
一方、outキーワードを付けた変数は、メソッドの内部で、値を定める必要があります。
ref
・呼び出し元の変数に対して変更を加えたい場合(配列の順番操作などに有効)
out
・複数のアウトプットをする必要がある場合(メソッドの戻り値が複数必要な場合、outを使えば、疑似的に実現できる)
refの例
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ref02 { class Program { static void Main(string[] args) { int[] arr = {2,7,5,3,1,8,6}; Console.WriteLine("ソート前"); foreach (var i in arr) { Console.Write(i); Console.Write(","); } Console.WriteLine(); Sort(ref arr); Console.WriteLine("ソート後"); foreach (var i in arr) { Console.Write(i); Console.Write(","); } Console.WriteLine(); } static void Sort(ref int[] arr) { for (int i = 0; i < arr.Length; i++) { for (int j = i; j < arr.Length; j++) { if (arr[i]>arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } } } |
実行結果
ソート前
2,7,5,3,1,8,6,
ソート後
1,2,3,5,6,7,8,
outの例
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Out01 { class Program { static void Main(string[] args) { int S; int V; MyClass.Calc(10, 20, 30, out S, out V); Console.WriteLine("直方体の面積は" + S + "体積は" + V); } } class MyClass { public static void Calc(int a, int b, int c, out int s, out int v) { s = 2 * (a * b + b * c + c * a); v = a * b * c; } } } |
実行結果
直方体の面積は2200体積は6000
※C#7.0から引数を指定する部分で、outパラメーター付きの変数を宣言できるようになりました。
そのため、事前に変数の宣言を省いたコードが書けるようになりました。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Out02 { class Program { static void Main(string[] args) { MyClass.Calc(10, 20, 30, out int S, out int V); Console.WriteLine("直方体の面積は" + S + "体積は" + V); } } class MyClass { public static void Calc(int a, int b, int c, out int s, out int v) { s = 2 * (a * b + b * c + c * a); v = a * b * c; } } } |
実行結果
直方体の面積は2200体積は6000
オーバーロードに関すること
refキーワードが付いているメソッドは付いていないメソッドと別ものだと判断されてオーバーロードが可能です。
ただし、refキーワードとoutキーワードのみ異なるメソッドはオーバーロードできません。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OverLoad10 { class Program { static void Main(string[] args) { int i = 10; Plus5(i); Console.WriteLine(i); Plus5(ref i); Console.WriteLine(i); //両立不可能 //Plus5(out i); //Console.WriteLine(i); } static void Plus5(int num) { num += 5; } static void Plus5(ref int num) { num += 5; } //両立不可能 //static void Plus5(out int num) //{ // num = 10; // num += 5; //} } } |
実行結果
10
15
関連記事
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。