UnityでC#使っている人へのEffective C#の勧め

この記事は、[C# Advent Calendar 2018](https://qiita.com/advent-calendar/2018/c-sharp)の15日目の記事になります。

最近、Unityエンジニアが増えて、目標だったことが出来たことで満足されている人が少なくないと思ったので、次のレベルアップとして**Effective C# 6.0/7.0**を買って読んだ上でパフォーマンスを意識した開発ができるようになろう！という話しになります。

スキルアップして、収入アップさせて、もの作り楽しんでいきましょー！！！＼＼\\٩( 'ω' )و //／／

![L.png](https://qiita-image-store.s3.amazonaws.com/0/82601/e4999c79-8494-0c93-7b4b-3d42a2bb9968.png)

> Effective C# 6.0/7.0 
Bill Wagner 鈴木幸敏 鈴木幸敏

> https://www.shoeisha.co.jp/book/detail/9784798154695
> http://amzn.asia/d/3Vm70LR


## Unityエンジニアが使えるようになったC# 6.0/7.0

- Unity C# 6.0
  - [Now available Unity 2018.2](https://blogs.unity3d.com/jp/2018/07/10/2018-2-is-now-available/)
  - [Unityで使える C# 6.0～と .NET 4.6](https://www.slideshare.net/ufcpp/unity-c-60-net-46)
- Unity C# 7.0
  - [Now available Unity 2018.3](https://blogs.unity3d.com/jp/2018/12/13/introducing-unity-2018-3/)
  - [C# 7.0で知っておくべき10の新機能](https://www.buildinsider.net/language/csharplang/070001)
  - [【Unity】スクリプトのコンパイル時間を大幅に短縮し、C# 7.2 の機能を使用できる「Unity Incremental Compiler」の導入方法を紹介](http://baba-s.hatenablog.com/entry/2018/03/29/111500)
  - [Unity 2018.3 の期待してる機能 & 愚痴](https://blog.citringo.net/2018/12/01/unity-2018-3-%E3%81%AE%E6%9C%9F%E5%BE%85%E3%81%97%E3%81%A6%E3%82%8B%E6%A9%9F%E8%83%BD-%E6%84%9A%E7%97%B4/)

とまぁ、最近ではUnityのC#について話しが落ち着いてきたなぁと思ったら先日リリースされた**Unity 2018.3にC# 7.3 – Roslyn**が入ってきました。

**Unity 2018.1~2018.2でコンパイル時間を大幅に短縮＆C# 7.2が使えるようになった**と思いきや、、、
早くもC# 7.3のお出ましですよ＞＜;


## Effective C#の勧めにあたって

なので、今後のUnityエンジニアは、unity technologiesのこの動きと流れに置いてけぼりにされず、さらに今まで書いていたC#はみるみる古くなっていくため、[.NET Conf](https://www.dotnetconf.net/)も気にしたりして最新の.NET/C#界隈をも追っていく必要がひしひしと感じるようになってくるだろう。

なので、今まではスキルアップの領域であったC# 6.0/7.0の習得も近い将来では必須になってくるだろう。
だけども、何から手をつけて良いのか分からないって人向けにEffective C# 6.0/7.0を買って、こういう学び方で今後あれこれみたいに開発すると良いかもーという話しをしようと思います！

### ピックアップ

全部紹介するのは辛く、でも、少しでも何から手をつけて良いのか分からない問題から奪還できるいとぐちが見つかるように、全章から1つ以下の内容をピックアップして紹介していきます。

- 第1章 C#言語イディオム 項目1 ローカル変数の型をなるべく暗黙的に指定すること
- 第2章 リソース管理　項目11 .NETのリソース管理を理解する
- 第3章 ジェネリックによる処理 項目入る前のまえふり
- 第4章 LINQを扱う処理 項目38 メソッドよりもラムダ式を使用すること
- 第5章 例外処理 項目47 アプリケーション固有の例外クラスを作成する 


## 第1章について： ローカル変数はvar使おうぜ！

ローカル変数の型を宣言する場合は、ガチガチに型を宣言するよりも**varを使うことを推奨**させること。
ただし、varを使うにあたっていくつか問題も出てくるから状況によっては避けた方がいいかもしれない。

だけども、暗黙的に型が宣言されていることが重要ですよー！という話しでローカル変数でvarを使う勧めが書かれています。


## 第2章について： .NETのガベージコレクタ(GC)を理解すること！

**優れたエンジニアってのは、メモリやリソースなどの実行環境について理解すること**なんです。
特にGCはC++のようにメモリを気にしなくて開発できるものの、パフォーマンスを気にするなら正しいGCの使い方を前提に開発することで、品質も上がるし、遥かに簡単にスムーズに開発できるからこそ優れたエンジニアになれる、って話しでさらに詳細が超面白いです！！

- [自動メモリ管理を理解する](https://docs.unity3d.com/jp/current/Manual/UnderstandingAutomaticMemoryManagement.html)
- [UnityのGCはどんな実装になっているのか](https://developer.aiming-inc.com/misc/what-impl-the-unity-gc/)
- [【Unity】Unity 2018.3 新機能 ガベージコレクションを無効化できる API が追加された](http://baba-s.hatenablog.com/entry/2018/09/28/210000)

↑こちらも紹介しておきますね👍

## 第3章について：クロージャージェネリック型を意識すること

ここは項目に入る前のまえふりが長くて、でも、すごい学びを得る章でもありますー！
ジェネリック型について、扱うにはメリットデメリットがあるから扱う際には注意しましょーねーと言う話しだったり、そもそもジェネリック型がどうやって実装されて動いているのか下のレイヤーから掘り下げてジェネリック型を理解していくことで、メリットデメリットを正確に知れるこれまた学びが多い章になってます！＞＜

**クロージャージェネリック型**ってところの話しは、この章で初めて知りました😂笑

## 第4章について： ラムダ式はいいぞ！（今更感w
最初の方はコード量が大幅に短縮できる話しから入りますが、実はここで紹介されるラムダ式によってリファクタリングされたコードには残念な点があって、**ラムダ式を知って使い始めた人がやりそうな失敗ソースコードを例に解説しているような感じで、ラムダ式を扱うポイント**が話されていますー！


ラムダ式はいいぞ！だが使い方によってクソコードになるぞ！！（笑）

## 第5章について： 独自例外の作成は意外にも落とし穴が...
Webアプリでもあると思いますが、ゲームアプリの開発だとおそらくWebアプリより多くの例外処理対応が存在すると思います。
特に、**いろんな人が関わるプロダクトでUnityで開発していると闇の一つだったり**しませんか？？笑

例えばこんなご経験はないだろうか。

```csharp
try 
{

  ...

}
catch (IOException e)
{
  ...
}
catch (Exception e)
{
  switch(status)
  {
    case status.normal:
      ...
    break;
    case status.critical:
      ...
    break;
    case status.failure:
      ...
    break;
  }
}

```

状況や環境が変わっていくと即レガシーコードになってしまい、もしかしたら正しく機能しなくなるソースコードにもなりえるとここでは解説され、このようにならないための対策方法や例外処理を正しく作る手法について紹介されています。


## さいごに
C# 6.0/7.0よりもC#の基礎から学べる本にもなっているので、毛嫌いせずに、**是非Effective C# 6.0/7.0を買って読んで優れたエンジニア**を目指してやっていきましょー！！(*･ω･)ﾉ

次は、More Effective C# 6.0/7.0も買って似たような記事作りましょーかねー。