C#入門記事を記載させていただいております。
Windows10+VSCode+.NET CoreでC#開発環境を作ろう!
初めてC#を学習する方へのおすすめサイト
あるある。引数の順番を間違えてしまう
C言語で以下のような関数を書いたとします。
#include <stdio.h>
staticvoidintroduce(char*country,char*name){printf("%sです。 %s出身です。\n",country,name);}intmain(void){introduce("東京","太郎");return0;}自己紹介の関数ですね。
実際に使用してみましょう。
東京です。 太郎出身です。
盛大に間違えてますね。
太郎さんは「東京出身の太郎です。」と出力されると思っていたようです。
今回のように、型が同じ関数だと、順番を間違えていてもコンパイラ等では判断できません。
テストするまで、間違えが残ってしまいます。
なんとかして順番ミスをなくしたい
C言語なら構造体を引数に
C言語で無理やり解決しようと思うとこんな感じでしょうか。
#include <stdio.h>
typedefstruct{char*country;char*name;}Profile;staticvoidintroduce(Profileprofile){printf("%sです。 %s出身です。\n",profile.name,profile.country);}intmain(void){introduce((Profile){.country="東京",.name="太郎"});return0;}順番ミスしなくはなりましたが・・・関数毎に構造体作るわけにもいきませんね。
ちょっとしんどい。
オブジェクト指向言語ならメソッドチェーン
C++であれば、クラス・メソッドを使用できるので以下のようなセッタを作成すると
引数を可視化してコーディングできます。
#include <iostream>
#include <string>
usingnamespacestd;classIntroduceClass{public:string_country;string_name;IntroduceClass(){_country="日本";_name="名無しの権兵衛";}IntroduceClass&setCountry(stringcountry){_country=country;return*this;}IntroduceClass&setName(stringname){_name=name;return*this;}staticvoidintroduce(constIntroduceClass&ic){cout<<ic._name+"です。 "+ic._country+"出身です。"<<endl;}};intmain(){IntroduceClass::introduce(IntroduceClass().setCountry("東京").setName("太郎"));return0;}メソッドチェーンと言われる記載方法ですね。
ちなみに関数呼び出し時に引数名を明示するためのイディオムを名前付きパラメータ・イディオム(Named Parameter Idiom)といいます。
C言語のケースと違ってクラス化を前提としているため、
「関数毎に作る」必要はなくなりました。
ただ、C言語よりも長くなった感じは否めない。
C#なら名前付き引数
C#の場合は、以下のようになります。
usingSystem;namespaceNamedArguments{classIntroduce{staticvoidMain(string[]args){introduce(name:"太郎",country:"東京");}staticvoidintroduce(stringcountry="日本",stringname="名無しの権兵衛"){Console.WriteLine(name+"です。"+country+"出身です。");}}}すばらしくスッキリ!
また、引数が増えてしまった場合だとしても
introduce(name:"太郎",country:"東京");関数呼び出し部分を改行して整形することで、JSONのようなスッキリした見栄えになります。
また、サンプルのように初期値を指定しておくことで、
必要なパラメータのみ記載して呼び出すことが可能です。
・・・毎回全パラメータ入力が必要ないのもすばらしい
まとめ
今回は名前付き引数をご紹介させていただきました。
これを使えば、もう引数の順番を気にすることもなければ、
メソッドに引数追加が必要になった際にもある程度安心できますね。