C# 6.0 の記述方法

# C# 6.0 の新機能
- [読み取り専用の自動プロパティ](#読み取り専用の自動プロパティ-read-only-auto-properties)
- [自動プロパティ初期化子](#自動プロパティ初期化子-auto-property-initializers)
- [ラムダ式によるメソッドとプロパティ](#ラムダ式によるメソッドとプロパティ-expression-bodied-function-members)
- [using static](#using-static)
- [Null 条件演算子](#null-条件演算子-null-conditional-operators)
- [文字列補間](#文字列補間-string-interpolation)
- [例外フィルター](#例外フィルター-exception-filters)
- [nameof 式](#nameof-式-the-nameof-expression)
- [Catch ブロックと Finally ブロックでの Await](#catch-ブロックと-finally-ブロックでのawait-await-in-catch-and-finally-blocks)
- [インデクサーを使用して関連コレクションを初期化する](#インデクサーを使用して関連コレクションを初期化する-initialize-associative-collections-using-indexers)


## 読み取り専用の自動プロパティ (Read-only auto-properties)
自動実装プロパティで読み取り専用を記述できるようになった。

```C#
class Person
{
	public DateTime Birth { get; } = new DateTime(1999, 12, 31);
}
```

<details><summary>以前の書き方</summary><div>
フィールドを用意する必要があった。

```C#
class Person
{
	private DateTime birth = new DateTime(1999, 12, 31);
	public DateTime Birth 
	{
		get { return this.birth; }
	}
}
```
</div></details>

## 自動プロパティ初期化子 (Auto-property initializers)
自動実装プロパティの初期値を指定できるようになった。

```C#
class Person
{
	public DateTime Birth { get; set; } = new DateTime(1999, 12, 31);
}
```

<details><summary>以前の書き方</summary><div>
コンストラクタで初期化する必要があった。

```C#
class Person
{
	public Person()
	{
		this.Birth = new DateTime(1999, 12, 31);
	}

	public DateTime Birth { get; set; }
}
```
</div></details>

## ラムダ式によるメソッドとプロパティ (Expression-bodied function members)

### メソッド (Methods)
簡単なメソッドを１行で書けるようになった。

```C#
class Person
{
	private DateTime birth = new DateTime(1999, 12, 31);
	public int GetAge() => DateTime.Today.Year - this.birth.Year + 1; // 数え年
}
```

<details><summary>以前の書き方</summary><div>
１行で書けなかった。

```C#
class Person
{
	private DateTime birth = new DateTime(1999, 12, 31);
	public int GetAge()
	{
		return DateTime.Today.Year - this.birth.Year + 1; // 数え年
	}
}
```
</div></details>

## using static
static クラスのメソッド呼び出し等に、クラス名が省略可能になった。

```C#
using static System.Math;

static class Util
{
	public static int Range(int value, int lower, int upper)
	{
		return Max(Min(value, lower), upper);
	}
}
```

## Null 条件演算子 (Null-conditional operators)
イベント発生等を簡潔に書けるようになった。

```C#
class Person
{
	private string name;
	public string Name
	{
		get { return this.name; }
		set
		{
			this.name = value;
			this.NameChanged?.Invoke(this, EventArgs.Empty);
		}
	}

	public event EventHandler NameChanged;
}
```

<details><summary>以前の書き方</summary><div>
null チェックの必要があった。

```C#
class Person
{
	private string name;
	public string Name
	{
		get { return this.name; }
		set
		{
			this.name = value;
			var handler = this.NameChanged;
			if (handler != null) handler(this, EventArgs.Empty);
		}
	}

	public event EventHandler NameChanged;
}
```
</div></details>

## 文字列補間 (String interpolation)
文字列の書式化が簡単になった。

```C#
var message = $"ファイル {path} が存在しません。";
```

<details><summary>以前の書き方</summary><div>
string.Format を使う必要があった。

```C#
var message = string.Format("ファイル {0} が存在しません。", path);
```
</div></details>

## 例外フィルター (Exception filters)
未

## nameof 式 (The nameof expression)
変数などの名前を文字列として取得できるようになった。

```C#
if (path == null) throw new ArgumentNullException(nameof(path));
```

<details><summary>以前の書き方</summary><div>
文字列で指定する必要があったため、リファクターの対象にならなかった。

```C#
if (path == null) throw new ArgumentNullException("path");
```
</div></details>

## Catch ブロックと Finally ブロックでの Await (Await in Catch and Finally blocks)
未

## インデクサーを使用して関連コレクションを初期化する (Initialize associative collections using indexers)
未