C#のあまり見かけない便利な5つの記法

  • 26
    Like
  • 1
    Comment

C#のあまり見かけない便利な5つの記法
あくまで主観ですが、調べ物をしていたりサンプルコードを見ていても、あまり見かけないけど便利な記法をメモとして纏めました。
誤りや補足などがあれば教えて頂けると幸いです。

1.文字列挿入

ログ出力などでstring.Formatを多用していましたが、C#6.0からは専用構文が使えるようになりました。
引数の数を間違えたり、コードが長くなったりするのを回避できます。式もかけたりします。

C#6.0から(文字列挿入)

var str1 = "あい";
var str2 = "えお";
Console.WriteLine($"{str1}う{str2}");

C#5.0まで(string.Format)

var str1 = "あい";
var str2 = "えお";
Console.WriteLine(string.Format("{0}う{1}", str1, str2));


2.プロパティ初期化子

こちらもC#6.0から使えるプロパティの初期化の構文です。

C#6.0から

//getのみも可能
public int ID { get; } = 1;
public string Name { get; private set; } = "あいうえお";

C#5.0まで

private int _Name = "あいうえお";
public int Name{
    get { return _Name; }
    set { _Name = value; }
}


3.オプション引数

メソッドの引数にデフォルト値や、特定の引数のみを指定できる機能です。

static void Main(string[] args) {
    // 0 + 0 + 0
    var result = sum();
    // 3 + 0 + 0
    result = sum(3);
    // 1 + 3 + 0
    result = sum(1, 3);
    // 1 + 3 + 2
    result = sum(1, 3, 2);
    // 0 + 3 + 0
    result = sum(y: 3);
}

static int sum(int x = 0, int y = 0, int z = 0) {
    return x + y + z;
}


4.outパラメータの変数宣言

outパラメータを使う場合、C#7.0以前では変数を宣言しなければいけませんでしたが、メソッド内で変数の宣言ができるようになっています。

C#7.0から

var str = "10";
bool success = int.TryParse(str, out int result);

C#6.0まで

var str = "10";
int result = 0;
bool success = int.TryParse(str, out result);


5.例外フィルター

一番使う頻度は低いですがキャッチした例外のInnerExceptionで処理を切り分けるのに使っています。

try {
        throw new ArgumentException("unknown");
    } catch (ArgumentException e) when (e.Message == "test") {
        // Messageがtestの時はエラー無視
    } catch (ArgumentException e) when (e.Message == "unknown") {
        // Messageがunknownの時はメッセージを出力
        Console.WriteLine(e.Message);
    } catch (ArgumentException e) {
        // その他
        throw;
    }


ローカル関数やタプルなどもよく使いますが、とりあえず纏めてみました。

C#は新しい機能がどんどん追加されていくので楽しいです。
サンプルコードでは古い記法や構文で紹介されていることも多いですが、
C#の良い所は可読性と生産性だと思っているので、簡潔に書けるなら新しい構文を覚えて損はないと思います。

3825contribution

C#6.0から(文字列挿入)

ideoneのC# (gmcs 4.6.2)で動作しました。

https://ideone.com/Tt0ryx

これは良いですね。