名前付き引数、省略可能な引数を理解しよう!

[C#] 名前付き引数、省略可能な引数を理解しよう!

※ 当サイトは広告を含みます。

ここでは少し特殊な引数の指定方法について学びます。
引数なのでメソッド(関数)で利用する知識ですが、知らなくても困らない気もします。

名前付き引数(Named arguments)

これはメソッドに引数を与える時に各引数を名前を利用して指定します。
正直、サンプルコード見てもらったほうが早いと思います。


namespace Sample
{
  internal class Display
  {
    public void Output(string name, int age, string address)
    {
      Console.WriteLine($"名前={name}, 年齢={age}, 住所={address}");
    }
  }

  internal class Program
  {
    static void Main(string[] args)
    {
      var d = new Display();

      // '名前付き引数' を利用する
      d.Output(name: "りさ", address: "2次元", age: 15);
    }
  }
}

こんな感じに引数名:(コロン)を利用して引数を指定します。
そうすると普通に引数を与える場合と異なり、好きな順番で記述することができます。


// '名前付き引数' を利用する
d.Output(name: "りさ", address: "2次元", age: 15);

その代わりメソッドの引数名を変えるとビルドエラーになります。
この部分が個人的に嫌いなので僕は使いません。いわゆる賛否ある系です。

管理人
管理人

引数を指定する時に分かりやすいと言う噂がある(適当)。

省略可能な引数(Optional arguments)

これは引数にdefault値を指定しておき、未指定の場合に自動的に値が適用される仕組みです。
以下がサンプルコードです。先程の名前付き引数と異なり、頻繁に使ってる気がします。


namespace Sample
{
  internal class Display
  {
    public void Output(string name, int age = 15, string address = "2次元")
    {
      Console.WriteLine($"名前={name}, 年齢={age}, 住所={address}");
    }
  }

  internal class Program
  {
    static void Main(string[] args)
    {
      var d = new Display();

      // '省略可能な引数' を利用する
      d.Output("りさ"); // ageとaddressは未指定だからdefault値が利用される
    }
  }
}

こんな感じにdefault値が指定してある引数が未指定だと、自動的にdefault値が採用されます。
その結果、必要な引数の個数を満たしてなくても、ビルドエラーにならず実行できます。


// '省略可能な引数' を利用する
d.Output("りさ"); // ageとaddressは未指定だからdefault値が利用される

なお、この仕組みには、いくつか注意点があります。

  1. default値を付けた引数より後ろに普通の引数は記述できない。
  2. default値に指定できるのはコンパイル時の定数値のみ。

1つ目はそのままの意味です。default値が付いた引数は省略して記述する都合から必ず最後に書きます。
仮にdefault値を付けた引数を複数使いたい場合、これら全てを最後に記述する必要があります。

要は最初とか真ん中の引数をdefault値が付いた引数にすることはできません。


// こういうのはビルドエラー
public void Output(string name, int age = 15, string address)
{
}

2つ目はdefault値に指定できる値の制限です。
default値は値型でも参照型でも何でも指定できますが、そこに記述する値はコンパイル時の定数である必要があります。

これはクラスみたいな値をdefault値に指定する場合、以下のような記述はできません。
と言うより、string以外の参照型はnullしか指定できないので、ほぼほぼ値型で利用します。


internal class Display
{
  // コンパイル時の定数以外はビルドエラー
  public void Output(Person person = new Person() { Name = "りさ", Age = 15 })
  {
  }
}

internal class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

あとがき

僕は遥か古来から省略可能な引数をdefault引数って呼んでるのですが、正式名称では無いと思います。
と言うか、何を参考にしてその名前を覚えてきたのか分からない。

◆ C#に関する学習コンテンツ

この記事は参考になりましたか?

関連記事

コメント

この記事へのコメントはありません。