Visual Studio2022でC#のコードスニペットを使ってみる

# 1. はじめに
* Visual Studio 2022でC#の開発をする時に同じコードはスニペットを使って効率化したい
* プロジェクト内のコーディングルールを独自にスニペットに追加したい

# 2. コードスニペットとは
## 2.1. コードスニペット
* あらかじめ用意されているコードのスニペットで、コードにすぐに挿入することができる

https://learn.microsoft.com/ja-jp/visualstudio/ide/visual-csharp-code-snippets?view=vs-2022

## 2.2. コードスニペットの利用例(for文)
* コードで```for```を入力して、Tabキーを2回押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/c7f58ca4-b73a-f285-497a-aa70a25514ff.png)

* for文のコードが挿入される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/1384df11-5606-95c5-4122-ea32e87a7dc1.png)

# 3. 既定のコードスニペット
* 既定では、Visual Studio の C# には次のコード スニペットが含まれる
## 3.1. ```#if```
```csharp
#if true

#endif
```

## 3.2. ```#region```
```csharp
#region MyRegion

#endregion
```

## 3.3. ```~```
```csharp
~HogeClass()
{
                
} 
```

## 3.4. ```attribute```
```csharp
[AttributeUsage(global::System.AttributeTargets.All, Inherited = false, AllowMultiple = true)]
sealed class MyAttribute : Attribute
{
    // See the attribute guidelines at 
    //  http://go.microsoft.com/fwlink/?LinkId=85236
    readonly string positionalString;

    // This is a positional argument
    public MyAttribute(string positionalString)
    {
        this.positionalString = positionalString;

        // TODO: Implement code here

        throw new NotImplementedException();
    }
}
```

## 3.5. ```checked```
```csharp
checked
{

}
```

## 3.6. ```class```
```csharp
class MyClass
{

}
```

## 3.7. ```ctor```
```csharp
public HogeClass()
{
          
}

```
## 3.8. ```cw```
```csharp
Console.WriteLine();
```

## 3.9. ```do```
```csharp
do
{

} while (true);
```

## 3.10. ```else```
```csharp
else
{

}
```

## 3.11. ```enum```
```csharp
enum MyEnum
{

}
```

## 3.12. ```equals```
```csharp
public override bool Equals(object obj)
{
    //       
    // See the full list of guidelines at
    //   http://go.microsoft.com/fwlink/?LinkID=85237  
    // and also the guidance for operator== at
    //   http://go.microsoft.com/fwlink/?LinkId=85238
    //

    if (obj == null || GetType() != obj.GetType())
    {
        return false;
    }

    // TODO: write your implementation of Equals() here
    throw new NotImplementedException();
    return base.Equals(obj);
}
```

## 3.13. ```exception```
```csharp
[global::System.Serializable]
public class MyException : Exception
{
    public MyException() { }
    public MyException(string message) : base(message) { }
    public MyException(string message, Exception inner) : base(message, inner) { }
    protected MyException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}
```

## 3.14. ```for```
```csharp
for (int i = 0; i<length; i++)
{

}
```

## 3.15. ```foreach```
```csharp
foreach (var item in collection)
{

}
```

## 3.16. ```forr```
```csharp
for (int i = length - 1; i >= 0; i--)
{

}
```

## 3.17. ```if```
```csharp
if (true)
{

}
```

## 3.18. ```indexer```
```csharp
public object this[int index]
{
    get { /* return the specified index here */ }
    set { /* set the specified index to value here */ }
}
```

## 3.19. ```interface```
```csharp
interface IInterface
{

}
```

## 3.20. ```invoke```
```csharp
EventHandler temp = MyEvent;
if (temp != null)
{
    temp();
}
```

## 3.21. ```iterator```
```csharp
public System.Collections.Generic.IEnumerator<ElementType> GetEnumerator()
{

    throw new NotImplementedException();
    yield return default(ElementType);
}
```

## 3.22. ```iterindex```
```csharp
public MyViewIterator MyView
{
    get
    {
        return new MyViewIterator(this);
    }
}

public class MyViewIterator
{
    readonly MyViewIterator outer;

    internal MyViewIterator(MyViewIterator outer)
    {
        this.outer = outer;
    }

    // TODO: provide an appropriate implementation here
    public int Length { get { return 1; } }

    public ElementType this[int index]
    {
        get
        {
            //
            // TODO: implement indexer here
            //
            // you have full access to MyViewIterator privates
            //

            throw new NotImplementedException();
            return default(ElementType);
        }
    }

    public System.Collections.Generic.IEnumerator<ElementType> GetEnumerator()
    {
        for (int i = 0; i < this.Length; i++)
        {
            yield return this[i];
        }
    }
}        
```

## 3.23. ```lock```
```csharp
lock (this)

{

}
```

## 3.24. ```mbox```
```csharp
MessageBox.Show("Test");
```

## 3.25. ```namespace```
```csharp
namespace MyNamespace
{

}
```

## 3.26. ```prop```
```csharp
public int MyProperty { get; set; }
```

## 3.27. ```XXXX```
```csharp
private int myVar;

public int MyProperty
{
    get { return myVar; }
    set { myVar = value; }
}
```

## 3.28. ```propg```
```csharp
public int MyProperty { get; private set; }
```

## 3.29. ```sim```
```csharp
static int Main(string[] args)
{

    return 0;
}
```

## 3.30. ```struct```
```csharp
struct MyStruct
{

}
```

## 3.31. ```XXXX```
```csharp
static void Main(string[] args)
{

}
```

## 3.32. ```switch```
```csharp
switch (switch_on)
{
    default:
}
```

## 3.33. ```try```
```csharp
try 
{	        
		
}
catch (global::System.Exception)
{

	throw;
}
```

## 3.34. ```unchecked```
```csharp
unchecked
{

}
```

## 3.35. ```unsafe```
```csharp
unsafe
{

}
```

## 3.36. ```using```
```csharp
using (resource)
{

}
```

## 3.37. ```while```
```csharp
while (true)
{

}
```

# 4. 独自のコードスニペットの登録
## 4.1. Visual Studio Snippet Generator
* 下記URLへアクセスする

http://tools.unitycoder.com/VisualStudioSnippetsGenerator/

* ShortCut, Codeは必須で入力し、Generate、Downloadボタンの順にクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/15176093-d4d2-4161-f748-6a9b208e57d4.png)
    * $end$ は、コード スニペットが挿入された後にカーソルを置く場所を示す
    * $selected$ は、呼び出されたときにスニペットに挿入されるドキュメントで選択されたテキストを表す

* ダウンロードしたファイルを任意のフォルダに格納する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f74c97e3-3ad1-8fab-7e0e-f3db3d57ec2f.png)

## 4.2. Visual Studioへのスニペット取り込み
* [ツール] > [コードスニペットマネージャー]を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/d28787e7-7a41-e6a5-121e-ec5a0c9a5a59.png)

* 言語はCSharp、場所はMyCodeSnippetを選択して、インポートボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/9cc35cf5-52bb-ba1c-6c8f-55e954196e18.png)

* Generateしたファイルを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/dd4b1fd4-89b8-cd45-9717-17fa3ca5abe1.png)

*　完了ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4ad2568f-6ea5-f1d9-b5c5-54a1066099ad.png)

## 4.3. Visual Studioでの動作確認
* ```dp```を入力し、Tabキーを2回クリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5e14de13-4b53-f2f8-66fb-420d83fa0f5b.png)
 
* コードが表示されることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/a8337b69-f590-cfbc-b764-729e58edc965.png)

## 4.3. コードスニペットの削除
* GUIで削除することができないため、フォルダの場所を直接開いてファイルを消す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/e9bf6989-be32-5af4-aa84-21045cc3b801.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f63f5e41-eecf-9708-0e46-33d2a3944375.png)

# 5. 参考文献

https://learn.microsoft.com/ja-jp/visualstudio/ide/visual-csharp-code-snippets?view=vs-2022

https://www.youtube.com/channel/UCPdRPZ9N_6rYPUvaC5Qi1iA

http://tools.unitycoder.com/VisualStudioSnippetsGenerator/