転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【技術書メモ】C#プログラミングのイディオム / 定石&パターン②

C#についてがっつり勉強しようと思い、購入した技術書。
まだまだ序盤だが、評判通りのかなりの良書の予感。
uuc1h.hatenablog.jp
では、前回同様、まとめていきたいといきます。

複数の値の代入方法

このやり方は知らなかったので、メモ。

for (int feet = 1; feet <= 10; feet++) {
    double meter = feet * 0.3048;
    // feetが{0}に、meterが{1}に代入される
    // {0.0000}は、meterの値を小数点第4位まで表示する書式設定
    Console.WriteLine("{0}ft = {1:0.0000}m", feet, meter);
}

定数について

定数の定義方法は、以下の通り。

// constは、staticと解釈されるので、staticをつける必要なし
private const double ratio = 0.3048;

けど、constした定数は、publicにしない方がいいとある。
「けど、他クラスから定数を呼び出す場合は結構あるし、そもそもなんでpublicにするべきなのか?」と思っていると、バージョン管理問題に関連するらしい。
※ここで、バージョン管理問題の詳細は割愛

publicにして、他クラスからアクセスさせたい場合は、static readonlyを使えばいい。

public static readonly double Ratio = 0.3048;

オブジェクト初期化子

オブジェクト生成をする際、各フィールドの初期値を設定する。

Sale sale = new Sale {
    ShopName = "ぱんや";
    ProductCategory = "食品";
    Amount = 120;
}

Dictionary型をforeachで扱う際

KeyValuePair型を1つずつ取り出す。ここらへん、あんまりピンとこなかったが、ソースで表すとしっくりきた。

Dictionary<string, int> amountPerStore = sales.GetPerStoreSales();

foreach(KeyValuePair<string, int> obj in amountPerStore) {
    Console.WriteLine("{0}{1}", obj.Key, obj.Value);
}

KeyValuePair型は、キーと値がペアになっていて、上記のようにそれぞれ取り出せる。

C#インターフェイスについて

public class List<T> : IList<T>, ICollection<T>,,,

上記のように記載されていたら、Listクラスは、IList、ICollectionなどのインターフェイスに定義しているメソッドやプロパティを実装していることを示している。
そのため、

List<int> list = new List<int>() {1, 2, 3,4, 5};
ICollection<int> collection = list;
var count = collection.Count;

IEnumerable<int> enumerable = list;
  • Listクラスは、ICollection型の変数に代入でき、ICollectionインターフェイスが定義するプロパティ、メソッドが使える。
  • プロパティ、メソッドの具体的な動作は、Listクラスに実装されている。

といった点が特徴である。

メソッドの戻り値や引数にインターフェイスを指定しておくと、プログラム修正に強くなる。
例:引数がこれまでListだったメソッドを、やはり配列も受け取りたいとした場合、引数をIEnumerableにしておけば、どちらでも受け取れる。

varによる暗黙の型指定

メソッド内のローカル変数宣言の際、型名の代わりにvarを使うと、コンパイラが自動で型を判断してくれる。

var dict = new  Dictionary<string, int>();

なお、代入の右側から型が明らか出ない場合は、varを使用しないこと。

今日は、こんな感じで終わります。
こうやって、まとめると頭に入るけど、やっぱ時間かかるな。