2022年01月03日
川俣晶の縁側ソフトウェアnew_C#入門・全キーワード明快解説!total 1276 count

in、out、ref、paramsキーワード: メソッドの引数を彩る多彩なオプション達

Written By: 川俣 晶連絡先

この章のテーマ §

 メソッドの引数に付加するin、out、ref、paramsキーワードについて学びます。引数で行う変数宣言についても学びます。

前提知識 §

Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, メソッドの基礎, 配列の基礎, int型, foreach文

解説 §

 メソッドの引数には、in、out、ref、paramsキーワードを付けることができます。

 具体的に使用した例はサンプルソースのsubメソッドの引数を見て下さい。

 それぞれの意味は以下の通りです。

  • 何も指定しない 引数を書き換えることはできるが、元のメソッドには反映されない
  • in メソッドに渡すだけ。書き換えることはできない。
  • out メソッドから値を返すだけ。値を渡すためには使えない。
  • ref 値を受け取って書き換えると呼び出し元にも反映される
  • params 任意個数の引数を列挙できる機能を実現する

 paramsだけは使い方が特殊で、引数にparamsキーワード付きの配列の引数を書いておくと、呼び出し側は任意個数の引数を記述できます。サンプルソースの利用例の通りです。

罠の数々 §

  • 値を呼び出し側が受け取る引数の場合、呼び出し側は引数として変数を書かねばならない。任意の式や定数を書いても値を受け取れないからである
  • paramsを付加できるのは最後の引数だけである
  • paramsを付加した引数には値を列挙する代わりに配列を渡すこともできる
  • out/refは、使用ができない場合や機能に制約を受ける場合もあるので、戻り値で値を受け取る方が良い。受け取りたい値が2つ以上あるときは、Tupleなどの複数の値を1つにまとめる機能の利用を検討しよう

参考リンク §

パラメーターの引き渡し (C# プログラミング ガイド)

params (C# リファレンス)

サンプルソース: passingParameters §

int a0 = 1;

int b0 = 2;

int d0 = 4;

int e0 = 5;

int e1 = 6;

int e2 = 7;

Console.WriteLine($"a0={a0}");

Console.WriteLine($"b0={b0}");

Console.WriteLine($"d0={d0}");

Console.WriteLine($"e0={e0}");

Console.WriteLine($"e1={e1}");

Console.WriteLine($"e2={e2}");

sub(a0, in b0, out int c0, ref d0, e0, e1, e2);

Console.WriteLine($"a0={a0}");

Console.WriteLine($"b0={b0}");

Console.WriteLine($"c0={c0}");

Console.WriteLine($"d0={d0}");

void sub(int a, in int b, out int c, ref int d, params int[] e)

{

    Console.WriteLine("sub called");

    a = a + 1;

    Console.WriteLine($"b={b}");

    // 以下の行は許されない。bには書き込めない

    //b = b + 1;

    // 以下の行は許されない。cは読み出せない

    //c = c + 1;

    c = 999;

    d = d + 1;

    foreach (var item in e) Console.WriteLine($"item={item}");

    Console.WriteLine("sub done");

}

実行結果 §

a0=1

b0=2

d0=4

e0=5

e1=6

e2=7

sub called

b=2

item=5

item=6

item=7

sub done

a0=1

b0=2

c0=999

d0=5

リポジトリ §

https://github.com/autumn009/CSharpPrimer2

練習問題 §

 以下のプログラムは実行すると123を出力する。正しsubメソッドの引数の書式(***の部分)はどれだろうか。

sub(***);

Console.WriteLine(x);

void sub(out int x) => x = 123;

  1. int x
  2. out x
  3. out int x
  4. out 123
  5. out int 123

[[解答]]

Facebook

キーワード【 川俣晶の縁側ソフトウェアnew_C#入門・全キーワード明快解説!
【new_C#入門・全キーワード明快解説!】の次のコンテンツ
2022年
01月
04日
文字列連結: 文字列を合体させるたった7つの冴えたやり方
3days 0 count
total 1032 count
【new_C#入門・全キーワード明快解説!】の前のコンテンツ
2022年
01月
02日
メソッド呼び出し: メソッドを呼び出す2つの方法
3days 0 count
total 850 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20220103094301
サイトの表紙【new_C#入門・全キーワード明快解説!】の表紙【new_C#入門・全キーワード明快解説!】のコンテンツ全リスト 【new_C#入門・全キーワード明快解説!】の入手全リスト 【new_C#入門・全キーワード明快解説!】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.