CodeGym /コース /C# SELF /デフォルト値と名前付き引数

デフォルト値と名前付き引数

C# SELF
レベル 8 , レッスン 4
使用可能

1. パラメータのデフォルト値

コーヒーショップを想像してみて:もし「砂糖入れる?」って聞かれて何も言わなかったら、バリスタはデフォルトでスプーン1杯入れてくれる。でも、たまには…2杯欲しい時もあるし!(ヒーロー!)全く砂糖なしもアリだよね。メソッドも同じで、パラメータを明示しなかった時に標準の値を使ってくれると便利なことがあるんだ。

名前付き引数は、コーヒーの注文で「ミルクはソイで!」って、材料の順番に関係なく指定できる感じだよ。

C#では、この2つの仕組みでコードがもっとクリーンで便利、しかもミスしにくくなる。実際のプロジェクトでもよく使われてるし、.NETのライブラリや有名なフレームワークでも当たり前。だから、これを使いこなせると就職でもポイント高いよ!

シンタックス

関数のパラメータのデフォルト値は、メソッド宣言の時に=で指定するよ。メソッド呼び出し時にそのパラメータを省略したら、指定したデフォルト値が使われる。


void PrintStudent(string name, int age = 18)
{
    Console.WriteLine($"学生: {name}, 年齢: {age}");
}
ageパラメータのデフォルト値

どう動くの?

  • PrintStudent("アリサ");を呼ぶと、学生: アリサ, 年齢: 18と表示される。
  • PrintStudent("サーシャ", 22);を呼ぶと、学生: サーシャ, 年齢: 22と表示される。

どんな型でも使える?

デフォルト値はどんな型のパラメータにも設定できるけど、ちょっとした注意点があるよ:

  • 参照型(stringやクラスなど):デフォルトでnullやリテラルを指定できる。
  • 値型(intdoubleboolなど):その型のリテラルを指定する。
  • 列挙型(enum)、構造体もデフォルト値が使える。

void AddStudent(string name, int course = 1, double averageScore = 5.0, string comment = null)
{
    Console.WriteLine($"追加された学生: {name}, コース: {course}, 平均点: {averageScore}, コメント: {comment}");
}
複数のパラメータに異なるデフォルト値

呼び出し例:

  • AddStudent("イワン");
  • AddStudent("マリア", 2);
  • AddStudent("フョードル", 2, 4.7, "優秀");

デフォルト値パラメータの順番

すべてのオプションパラメータ(デフォルト値付き)は右側(必須パラメータの後)に置かないとダメ。もしデフォルト値付きパラメータを必須の前に置いたら、コンパイラが怒るよ。


// エラー!
void Test(int a = 1, int b)
{
    // ...
}
デフォルト値パラメータは必須の前に置けない

なんで? そうしないと、コンパイラがどの引数がどのパラメータか正しく判断できなくなるからだよ。

2. 名前付き引数

普通は、メソッドを呼ぶ時に引数の順番をパラメータの順番と同じにしないといけない。でも、パラメータが多かったり、デフォルト値があったりすると、順番を間違えやすいよね。

名前付き引数を使うと、どの引数がどのパラメータか順番関係なく明示できるんだ。


AddStudent(name: "エリザヴェータ", averageScore: 4.2, comment: "今学期のベスト学生");
名前付き引数でメソッドを呼ぶ
  • ここではコース(course)を指定してないから、1(デフォルト値)が使われる。
  • commentが何番目か覚えてなくても、名前で指定できるから安心。

パラメータの順番を入れ替えてもOK:


AddStudent(averageScore: 3.7, name: "ゲオルギー");
名前付き引数の順番は関係ない

めっちゃ便利で、コードもかなり読みやすくなる!

位置引数との組み合わせ

名前付き引数と位置引数(名前なし)は混ぜて使えるけど、位置引数は先に全部書かないとダメ。


// OK
AddStudent("セルゲイ", averageScore: 4.9);

// エラー
AddStudent(course: 2, "フィリップ");
最初の名前付き引数の後は全部名前付きじゃないとダメ

最初の名前付き引数の後は全部名前付きにしよう。 コンパイラはこの順番を厳しくチェックして、予期せぬバグから守ってくれるよ。

パラメータが多いメソッドでの便利さ

オプションがたくさんあるメソッドでよく使うテクだよ。例えば、クラウドDBにユーザーを追加する関数を書くとしたら:


void RegisterUser(
    string username,
    string password,
    string email = null,
    bool admin = false,
    bool sendWelcomeEmail = true,
    string language = "ru"
)
デフォルト値付きでパラメータが多いメソッド

名前付き引数なしだと、呼び出しがカオス:

RegisterUser("cat", "qwerty", null, false, true, "ru");

名前付き引数を使えば、めっちゃ読みやすくて安心:

RegisterUser("cat", "qwerty", admin: true, sendWelcomeEmail: false, language: "en");

アドバイス:名前付き引数を使えば、ドキュメント見なくてもコードが読めるようになるよ!

3. 実装の注意点とよくあるミス

デフォルト値や名前付き引数を使い始めたばかりだと、いろんなところでミスしがち。

  • パラメータの順番。 デフォルト値付きパラメータは必須の後に置こう。順番を間違えるとコンパイラがエラーを出すよ。
  • ライブラリでデフォルト値を変える。 ライブラリでデフォルト値を変えても、古いクライアントは自動で新しい値を使わない。デフォルト値は呼び出し側のコードにコンパイルされるから、公開ライブラリのデフォルト値を変える時は慎重に!
  • 位置引数と名前付き引数の混在。 位置引数と名前付き引数を混ぜて、名前付きの後にまた位置引数を指定するとエラーになる。例えば:Func(a: 1, 2)はエラー。
  • パラメータ名のタイプミス。 コンパイラは厳しいよ:もしスペルミスしたら(例:naem: "ミーシャ")、"そんなパラメータないよ、何やってんの?"みたいなエラーが出る。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION