【Visual Studio】Unityエンジニアから見たReSharperの便利機能まとめ

# はじめに

本記事は[Visual Studio Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vs)の24日目の記事です。

昨日は [tafuji](https://qiita.com/tafuji) さんの[<font color="LimeGreen">Visual Studio 拡張機能から Visual Studio プロジェクトを弄ってみる</font>](https://qiita.com/tafuji/items/fd36c373f770d1ef4707)でした、お誕生日おめでとうございました！

# ReSharper

- 「このクラス、どの名前空間だっけ…？」
- 「このループ処理、LINQで簡潔に書けそうだけどどのオペレータ使えば良いんだっけ…？」
- 「このLINQ、もっと簡潔に書ける気がする」

上記のような場面は少なからずあると思います。
それらの悩みをすぐに解決してくれるVisual Studioの拡張プラグインが[ReSharper](https://www.xlsoft.com/jp/products/jetbrains/resharper.html)です。

[![resharper_logo_300x300.png](https://qiita-image-store.s3.amazonaws.com/0/126970/497998e2-e456-8d30-5c42-28fc90ae2f16.png)](https://www.xlsoft.com/jp/products/jetbrains/resharper.html)

## 機能紹介

### **コーディング規約の統一**

![ss7.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/2eb52104-ba1c-a1ec-0270-2e850cd9360c.gif)

`ReSharper > Options... > Code Editing > C# > NamingStyle`で命名規則を設定することが出来ます。

![2017-12-25_02h46_24.png](https://qiita-image-store.s3.amazonaws.com/0/126970/845e44e8-5111-173e-2bc0-8b9616fea48b.png)

### **リネーム**

![ss10.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/e75bdfa7-6081-c5a8-618c-bf5041c2602e.gif)

### **使われていないコードの強調表示**

![2017-12-25_00h18_41.png](https://qiita-image-store.s3.amazonaws.com/0/126970/776a37cd-72da-543d-170a-565546a601f0.png)

使われていないメソッドや変数、名前空間を灰色で表示してくれます。

### **欠落している名前空間のインポート**

![ss5.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/e54de6c9-53e9-8deb-3d73-27a523e39bfc.gif)

### **ループ処理からLINQへの変換**

![ss3.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/4ab75953-5619-59bc-3b9f-26710ac85e20.gif)

```csharp:Before
private static void Hoge()
{
    // 1から100までの偶数の和を表示する
    IEnumerable<int> numbers = Enumerable.Range(1, 100);
    int sum = 0;

    foreach (int number in numbers)
    {
        if (number % 2 == 0)
        {
            sum += number;
        }
    }

    Debug.Log(sum);
}
```

```csharp:After
private static void Hoge()
{
    // 1から100までの偶数の和を表示する
    IEnumerable<int> numbers = Enumerable.Range(1, 100);
    int sum = numbers.Where(number => number % 2 == 0).Sum();

    Debug.Log(sum);
}
```

### **LINQの簡略化**

![ss4.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/4e2bcb73-3756-3d83-0026-4421d54ced32.gif)


```csharp:Before
private static void Hoge()
{
    // 1から100までの整数に101が含まれていないか？
    IEnumerable<int> numbers = Enumerable.Range(1, 100);

    if (!numbers.Any(number => number == 101))
    {
        Debug.Log("101は含まれていない");
    }
}
```

```csharp:After
private static void Hoge()
{
    // 1から100までの整数に101が含まれていないか？
    IEnumerable<int> numbers = Enumerable.Range(1, 100);

    if (numbers.All(number => number != 101))
    {
        Debug.Log("101は含まれていない");
    }
}
```

### **オブジェクト初期化子の提案**

![ss2.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/2ce27dc3-5a81-861a-778e-018b624a781c.gif)

```csharp:Before
public class HogeClass
{
    public int Age;
    public string Name;
}

private static void Hoge()
{
    var hogeClass = new HogeClass();
    hogeClass.Age = 0;
    hogeClass.Name = "Hoge";

    Debug.Log(hogeClass.Name);
}
```

```csharp:After
public class HogeClass
{
    public int Age;
    public string Name;
}

private static void Hoge()
{
    var hogeClass = new HogeClass
    {
        Age = 0,
        Name = "Hoge"
    };

    Debug.Log(hogeClass.Name);
}
```

### **コレクション初期化子の提案**

![ss1.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/9b7991b1-3017-0b0a-833f-1734f3d251b7.gif)

```csharp:Before
private static void Hoge()
{
    var list = new List<string>();
    list.Add("Hoge");
    list.Add("Piyo");
    list.Add("HogePiyo");

    Debug.Log(list.First());
}
```

```csharp:After
private static void Hoge()
{
    var list = new List<string> {"Hoge", "Piyo", "HogePiyo"};

    Debug.Log(list.First());
}
```

### **Postfix Templates**

![ss6.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/4fc6b0cf-1c5b-d4c7-8c6a-383133981640.gif)

Postfix Templatesを使うことで流れるようにコーディングすることが出来ます。

| ショートカット | 例 |
|:-----------|:-----------|
| .arg | Method(expr) |
| .await | await expr |
| .cast | ((SomeType) expr) |
| .else | if (!expr) |
| .field | _field = expr; |
| .for | for (var i = 0; i < xs.Length; i++) |
| .foreach | foreach (var x in expr) |
| .forr | for (var i = xs.Length-1; i >= 0; i--) |
| .if | if (expr) |
| .lock | lock (expr) |
| .new | new SomeType() |
| .not | !expr |
| .notnull | if (expr != null) |
| .null | if (expr == null) |
| .par | (expr) |
| .parse | int.Parse(expr) |
| .prop | Property = expr; |
| .return | return expr; |
| .sel | l selected + expression l |
| .switch | switch (expr) |
| .throw | throw expr; |
| .to | lvalue = expr; |
| .trypars | int.TryParse(expr, out value) |
| .typeof | typeof(TExpr) |
| .using | using (expr) |
| .var | var x = expr; |
| .while | while (expr) |
| .yield | yield return expr; |

### **C# 6.0相当のコードへの変換**

![ss8.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/f5d38782-21f4-aebe-246e-764dad28fc82.gif)

```csharp:Before
[SerializeField]
private int _hoge;
public int Hoge { get { return _hoge; } }
```

```csharp:After
[SerializeField]
private int _hoge;
public int Hoge => _hoge;
```

ラムダ式本体によるプロパティの記述や文字列補間を提案してくれます。

![ss9.gif](https://qiita-image-store.s3.amazonaws.com/0/126970/6580d3d0-d4ce-68a4-b133-cb9fe86234f4.gif)

```csharp:Before
private void Hoge()
{
    // ※ nameof演算子もC# 6.0相当の機能
    Debug.Log(string.Format("{0}: {1}", nameof(_hoge), _hoge));
}
```

```csharp:After
private void Hoge()
{
    Debug.Log($"{nameof(_hoge)}: {_hoge}");
}
```

# 参考記事

[ReSharper 2017.3 Help](https://www.jetbrains.com/help/resharper/Introduction__Index.html)
[ReSharperのすすめ](https://qiita.com/papeMK2/items/f85c21ad07d3ba04e572)
[ReSharperのテンプレート機能について](https://qiita.com/norimatsu_yusuke/items/94b2f8f9eccbed5f162c)

# おわりに

[ReSharper](https://www.xlsoft.com/jp/products/jetbrains/resharper.html)は快適なコーディング環境を作り上げる素晴しいVisual Studioの拡張プラグインです。

本記事に含まれていないオススメ機能がありましたらお気軽に編集リクエストやコメントを送っていただけますと追記いたします。

明日の[Visual Studio Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vs)は [baba_s](https://qiita.com/baba_s) さんの[<font color="LimeGreen">【Visual Studio 2017】オススメの拡張機能 その2（25個）</font>](http://baba-s.hatenablog.com/entry/2017/12/25/000000)です！