restofwaterimp.hatenablog.com
の続きです。
3章までは準備編となっていて、4章からは基本イディオムの紹介
仕事で使っているのが、C# 5.0(Visual Studio 2013)なのと、今までC#のバージョンを折ったことなかったので、C# 6.0以降で利用できるイディオムを初めて知った。
知っているのと知らないのでは、自分のコーディングのスピード、メンテナンス性と他人のソースをレビューする速度や品質が変わるので、使える部分は使いたいと思う。
記載されている基本イディオムの内容は以下のものでした。
- 初期化
- 分岐、比較
- 繰り返し
- 条件演算子、null演算子
- プロパティ
- メソッド
- その他
可読性や保守性を考えた場合、こう書いた方がいいよねということ記載されています。
気になった部分や「そうなんだ」と思った箇所を中心に書きます。
初期化
配列の初期化
var names = new List<string> { "Tokyo", "Nagoya", "kyoto", };
最後の項目の後ろにカンマをつけておく。
なんで、最後にカンマつけるのだろうとよく思っていた。
実際、カンマはつけなくてもコンパイルは通ります。
他の記事とか見ていますと、項目とカンマをセットにして値を取り出したいとか
した場合、ついていた方がいいよね、と記載されていました。
配列というかenumで定義する時に最後にカンマつけるているケースを見かけます
オブジェクトの初期化
public class Person{
public string Name { get; set; }
public string Birthday { get; set; }
public string PhoneNumber { get; set; }
}
var person = new Person
{
Name = "hogehoge",
Birthday = "20010910",
PhoneNumber = "xxx",
};
オブジェクトを初期化するときはこう書くけど、入門書や少し古い本だと
person.Name = "hogehoge";
と書いてあるもんもありますよね。
書籍に書いてある通り、初期化コードの間に、無関係なロジック入れる人がごくごくたまにいるので、。
分岐、比較
returnの扱い方
時々、「1メソッドにreturnは一つしか書いてはダメ」みたいな教えを受けた人に出会い、途中でreturn を書けば、見やすいのに。
if ( xxx ) {
if ( xxx) {
if(xxx) {
}
}
}
return value;
みたいな感じのifのネストもしくはフラグ使いまくり・・・のソースに出くわします。
意味合いが同じなら、途中でreturn を書いて、ソースを見やすくしてほしいな。
繰り返し
要素の数だけ繰り返す
public void a(){
var nums = new List<int> { 1, 2, 3, 4, 5, };
nums.ForEach(n => Console.WriteLine(n));
}
LINQのForEachメソッドを利用するとこうかけるみたいです。
いつもforeach(var n in xxx) を使っているので、そういう書き方するんだという印象。
1文だけのそy理なら、ForEachメソッドで書くといいねと書いてありました。
条件演算子
条件が複雑でない、戻り値が単純なら以下のように記述する。
var value = xxxx ? trueの値 : falseの値
条件演算子は見た目がすっきり!になりますが、条件が複雑であったり、戻り値に対する処理や値が多い場合はif文を使ってもらった方が、後々意味が通る。
合体演算子
.net 2.0で導入されているが、この書き方で描かれているのはお目にかかったことがない。
Null合体演算子 - Wikipedia
var message = hoge(code) ?? Default-value
null演算子
c# 6.0 から導入されている。c#5.0までしか見たことないので、お初。
value?.hoge
hogeの値がない場合nullで返してくれる。
if(value == null){
return null;
}else{
return value.hoge
}
と同等
プロパティ
読み取り専用プロパティ
プロパティのsetアクセサーをprivateの可視性にして定義するか、
setアクセサーをそもそも記述しないことで対応できる。
C# 6.0からは
public string Name => hoge + "" + xxx;
とすることで、読み取り専用のプロパティを作成できる。
参照型の読み取り専用プロパティ
上記のようにprivateで書いても、書き換えられないのは参照(メモリの)のみで、
参照先の値は変更できます。そのため、こちらが意図したい、値の変更を不可ということが実現できません。
コレクション自体を変更不可にするにはIReadOnlyList<type>,IEnumerable<type>を利用する。
public IReadOnlyList<int> hogeList { get; private set;}
メソッドに関する
可変長引数
params キーワード
ログの引数を与えたりする時に使ってます。
public void WriteLog(string messageFormat, params object[] args){
var s = String.Format(messageFormat, args);
WriteLine(s);
}
呼び出し元は
hoge.WriteLog("output format", time, user, action);
time,user,action など、個数に限らず、paramsを指定することで可変に設定可能
オーバーロードよりオプション引数
多態性でオーバーロードを見ることはありますが、C#に限らず、使われ始めているような。
method(int num, string message = "hogehoge", int count = 3);
呼び元
numは必ず指定する。他は指定していなければ、デフォルト値が設定されます。
結果、オーバーロードっぽく見えます。
method(3);
method(4, "hello");
method(6, "good", 3);
その他
逐語的リテラル文字
先頭に@を書きます。
var path = @"C:¥resource¥file.txt";
@を書くことで¥がエスケープ文字として認識されなくなります。
固定値で書くときはこれでいいのですが、データベースなどで設定している値をシステム、特にOSウィンドウの値などに設定すると、エスケース文字として¥が扱われることがあります。
その場合、かっこ悪いですが
'"' + path + '"' と切って、エスケープ文字として見られないように
前後にDouble Quotationを入れたりしています。
文字列を数値に変換
int.Parse(str)を利用すると、失敗した時にExceptionが発生して面倒なんですよ。
本書に記載のように先に失敗しないかをint.TryParse(str)で確かめておくと確かにいい感じです。
例外の再スロー
throw;だけです。
時々 throw ex;で書かれます。スタックトレースが消えるのでご勘弁・・です。
他にも書いてありますが、そこは書籍で確認で!
標準化という訳ではないですが、「こうやって常にコードを書く」と意識しておくことで、綺麗で、あとで見やすいコードになります。
次は5章 文字列の操作
<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774187585/restofwaterim-22/ref=nosim/" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/51Q1LFkj2qL._SL160_.jpg" alt="実戦で役立つ C#プログラミングのイディオム/定石&パターン" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774187585/restofwaterim-22/ref=nosim/" name="amazletlink" target="_blank">実戦で役立つ C#プログラミングのイディオム/定石&パターン</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 18.09.09</div></div><div class="amazlet-detail">出井 秀行 <br />技術評論社 <br />売り上げランキング: 10,714<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774187585/restofwaterim-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>