restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

【C#】C#プログラミングのイディオム(4章) 基本イディオム

 

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メソッドで書くといいねと書いてありました。

 

条件演算子、null演算子

条件演算子

条件が複雑でない、戻り値が単純なら以下のように記述する。

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>