エンジニアの将来って?

現在7年目のCOBOL→Java→C#エンジニアが、将来への考えや勉強のアウトプット、たまに腎臓について書くブログです

【C#】名前付き引数について解説します。

こんにちは。たいら(@tairaengineer2)です。
この記事では、C#名前付き引数について解説します。

前提条件

この記事では、Visual Studio 2017 Communityを使っています。
インストールの仕方は、下の記事をご参考ください。

www.tairax.com

名前付き引数とは

名前付き引数
名前付き引数を使用すると、呼び出されたメソッドのパラメーター リストに記述されているパラメーターの順序を記憶したり、検索したりする必要がなくなります。
各引数のパラメーターはパラメーター名で指定できます。

名前付き引数と省略可能な引数 (C# プログラミング ガイド) | Microsoft Docsから引用させて頂きました

使い方は、たとえば

public int GetSum(int a, int b)

というメソッドがあった場合、

GetSum(a: 3, b: 4)

という風に、指定したいメソッドの引数で指定している名前のあとに:(コロン)と指定したいものを書けばOKです!

メソッドに引数を渡す場合、メソッドで指定している順番どおりに渡す必要があります。
順番を間違うと、エラーが起こったり、バグの原因となります。
でも、名前付き引数を使うと、そういう心配がないんです!
いやあ、便利ですね♪

では、早速使ってみましょう!

解説で使うC#の概要

3つのint型の引数を渡すと、計算して結果が返ってきて、その結果をコンソールに表示するプログラムです。
コンソールプロジェクトを作成するやり方は下の記事をご参考ください。

www.tairax.com

C#プログラム

メインプログラムを1つ、計算するプログラムを1つ、合計2つのプログラムを作りました。

計算プログラム

namespace ConsoleApp1
{
    static class SumCalculation
    {
        /// <summary>
        /// 3つの引数を計算して返すメソッド
        /// </summary>
        /// <param name="a">1つめ</param>
        /// <param name="b">2つめ</param>
        /// <param name="c">3つめ</param>
        /// <returns>引数の合計</returns>
        public static int GetSum(int a, int b, int c)
        {
            return a * b + c;
        }
    }
}

メインプログラム

using System;

/// <summary>
/// 名前付き引数を練習するクラス
/// </summary>
namespace ConsoleApp1
{
    class Program
    {
        /// <summary>
        /// メイン
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Console.WriteLine("----名前付き引数を使わない結果----");
            int result = SumCalculation.GetSum(3, 4, 5);
            Console.WriteLine("引数3, 4, 5:" + result);
            int result1 = SumCalculation.GetSum(4, 5, 3);
            Console.WriteLine("引数4, 5, 3:" + result1);
            Console.WriteLine("----名前付き引数を使った結果----");
            int allNameResult = SumCalculation.GetSum(c: 5, a: 3, b: 4);
            Console.WriteLine("引数c: 5, a: 3, b: 4:" + allNameResult);
            int nameResult = SumCalculation.GetSum(3, c: 5, b: 4);
            Console.WriteLine("引数3, c: 5, b: 4:" + nameResult);
        }
    }
}

実行結果

f:id:Tairax:20181214082007p:plain

----名前付き引数を使わない結果----
引数3, 4, 5:17
引数4, 5, 3:23
----名前付き引数を使った結果----
引数c: 5, a: 3, b: 4:17
引数3, c: 5, b: 4:17
続行するには何かキーを押してください . . .

では、解説していきます!

実行結果の解説

名前付き引数を使わない場合の結果を見てみましょう。

結果
int result = SumCalculation.GetSum(3, 4, 5); 17
int result1 = SumCalculation.GetSum(4, 5, 3); 23

名前付き引数を使わない場合、順番が異なると結果が違っています。
それは

aに入る数字 bに入る数字 cに入る数字
SumCalculation.GetSum(3, 4, 5) 3 4 5
SumCalculation.GetSum(4, 5, 3) 4 5 3

この通り、メソッドが指定した通りの順番で引数に数字が入るからです。
人がすることなので、順番を間違うことはあります。
これが、バグの原因になります。

では、名前付き引数を使った結果を見てみます。

結果
SumCalculation.GetSum(c: 5, a: 3, b: 4); 17
SumCalculation.GetSum(3, c: 5, b: 4); 17

という風に名前付き引数で指定しているから、メソッドで指定している引数の順番どおりにならなくてもOKなんです!

また、引数の指定に一般的な指定の仕方と、名前付き引数を混ぜてもOKです。

SumCalculation.GetSum(3, c: 5, b: 4);

これは1つ目の3は、名前付き引数で指定していないのでaに入ります。
もし

int faultResult = SumCalculation.GetSum(5, a: 3, b: 4);

というように指定した場合

f:id:Tairax:20181215134455p:plain

CS1744 名前付き引数 'a' は、位置引数が既に指定されているパラメーターを指定します

というようにエラーメッセージが出ます。
つまり、一般的な指定の仕方の方が、名前付き引数より優先されます。

まとめ:名前付き引数を使ってみよう!

以上が名前付き引数の解説です。

あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ

 

ほかにもC#勉強記事を書いてます。
よければご参考ください。

【C#】文字列を数値に変換できるか調べるTryParseメソッドの使い方

【C#】string.Formatと文字列補完を解説します

【C#】DateTimeオブジェクトを、string型に変換するメソッドを紹介します