平成と共に振り返るC#の歴史

平成も終わるので、C#の年表と変更点と共にその年に起こった出来事を軽く書いて行きます。
(マイナーバージョンは割愛します）

C#の変更点は抜粋して記載します。

# C# 1.0

|リリース時期|.NET Framework|平成|出来事|
|:--|:--|:--|:--|
|2002年1月|1.0|14年|多摩川にタマちゃん襲来<br>Xbox発売|

平成を元年から振り返りたかったですが、14年から開始です。お許しください。

## ◾️変更点

最初なので変更点ではないですが、初期リリースの機能について軽く触れます。

- クラス
- 構造体
- インターフェース
- イベント
- プロパティ
- デリゲート
- 式
- ステートメント
- 属性
- リテラル

>C# バージョン 1.0 は Java によく似ていました。
[Microsoft Docsより](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-version-history)

↑クラスやメソッドの書き方、変数定義なんかはそっくりです。
構造体が使えるあたりはC言語ですね。

# C# 2.0

|リリース時期|.NET Framework|平成|出来事|
|:--|:--|:--|:--|
|2005年11月|2.0|17年|愛知万博開催<br>YouTube開設|

## ◾️変更点

- Null 許容型

```csharp
int? num = null;
```
2.0でNULL許容型が導入されます。


# C# 3.0

|リリース時期|.NET Framework|平成|出来事|
|:--|:--|:--|:--|
|2007年11月|2, 3, 3.5|19年|初代iPhone発売(日本未販売)<br>食品偽装問題|

## ◾️変更点

- 自動実装プロパティ
- ラムダ式
- 型推論

```csharp
// 自動実装プロパティ
string Name { get; set; }

// ラムダ式
(int i) => i + 1; 

// 型推論
var test = "TEST";
```

私は上記すべて多用しています。
特にラムダ式はLINQでは必要不可欠です。ありがたや。
2007年リリースなので、10年前からあるんですね。

# C# 4.0

|リリース時期|.NET Framework|平成|出来事|
|:--|:--|:--|:--|
|2010年4月|4.0|22年|はやぶさが地球に帰還<br>もしドラ|

## ◾️変更点

- 名前付き/省略可能な引数

```csharp
private int SampleFunc(int x, int y, int z = 0)
{
    return x + y + z;
}

SampleFunc(x: 1, y: 2); // 名前付き
SampleFunc(1, 2); // 省略可能な引数
SampleFunc(1, 2, 3);
```

# C# 5.0

|リリース時期|.NET Framework|平成|出来事|
|:--|:--|:--|:--|
|2012年8月|4.5|24年|東京スカイツリー開業<br>金環日食|

## ◾️変更点

- 非同期処理 (await, async)

```csharp
private async Task SleepAsync()
{
    await Task.Delay(10 * 1000);
    Console.WriteLine("Success.");
}

SleepAsync();
Console.WriteLine("Execute.");

// 出力結果
// Execute.
// Success.
```

# C# 6.0

|リリース時期|.NET Framework|平成|出来事|
|:--|:--|:--|:--|
|2015年7月|4.6|27年|北陸新幹線開業<br>Windows 10リリース|

## ◾️変更点

- テンプレート文字列

```csharp
// 今まで
Console.WriteLine(string.Format("{0}時 {1}分 {3}秒", h, m, s);
// または
Console.WriteLine(h + "時" + m + "分" + s + "秒");

// テンプレート文字列
Console.WriteLine($"{h}時 {m}分 {s}秒");
```

# C# 7.0

|リリース時期|.NET Framework|平成|出来事|
|:--|:--|:--|:--|
|2017年3月|4.6.2|29年|プレミアムフライデー<br>Nintendo Switch|

## ◾️変更点

- 出力変数宣言
- パターン マッチング

```csharp
// 出力変数宣言
// 今までは[DateTime dateValue]の宣言が必要だった
var dateStr = "2018-12-19";
if (DateTime.TryParse(dateStr, out var dateValue))
{
    Console.WriteLine("dateStr is Date");
}

// パターン マッチングと型スイッチ
if (obj is int num && num >= 0)
{
    Console.WriteLine("objは正の整数です。)
}

switch(obj)
{
    case 0:
        // ０の時だけここに来る
        break;
    case int num:
        // 整数の時だけここに来る
        break;
    case int num when num >= 0:
        // 整数且つ、０以上の時だけここに来る
        break;
}
```

# C# 8.0

|リリース時期|.NET Framework|平成|出来事|
|:--|:--|:--|:--|
|20XX年XX月|4.8(仮)|-|-|

## ◾️変更点(未確定)

- Nullable reference types
- Ranges and indices

```csharp
// Nullable reference types
// 以下の実装で警告が出るようになるらしい
string s = null; // Warning: Assignment of null to non-nullable reference type

// こっちは出ない
string? s = null; // Ok

// Ranges and indices
// インデックスの指定に使うらしい
Index i1 = 3;  // 前から数えて３番目
Index i2 = ^4; // 後ろから数えて４番目
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"
```

# 最後に

現時点での最新版[C# 8.0]は平成のうちにリリースされるのか、
そしてリリースされる時期には何が歴史として残るのか、今後もC#と共に生きて見守ろうと思います。