C#/.NET関連の雑多なメモ

# 便利なオンラインサービス

- [情報が多いリンク集](https://github.com/quozd/awesome-dotnet)
- [dotnet/dotnet-developer-projects.md at master · microsoft/dotnet](https://github.com/microsoft/dotnet/blob/master/dotnet-developer-projects.md)

## オンラインコンパイラ
- [sharplab](https://sharplab.io/)  
  最新のコンパイラが使用できるが、実行は制限が非常に厳しい。  
  (コンパイルやアセンブラだけなら可)
- [.NET Fiddle](https://dotnetfiddle.net/)  
  .NET 5が使える。制限は緩いが、IDEが若干残念。
- [Compiler Explorer](https://godbolt.org/)
  アセンブリが見やすく、実行もできる。
- [try.NET](https://try.dot.net/)  
  C# 7.3相当(2020/06/30時点)と思われるが、`Span`は使用できない。
- [wandbox](https://wandbox.org/)  
  .NET Core/Mono(mcs)が選べるが、.NET Coreの場合は実行に時間がかかる。
- [paiza.io](https://paiza.io/ja/projects/new)  
  Mono 4.5?なので C# 6.0相当と思われる

## APIなど
- [.NET API Catalog](https://apisof.net/)  
  API毎に対応しているバージョンがわかる
- [DotNetApis](http://dotnetapis.com/)  
  NuGetのパッケージ内のAPI検索
- [fuget.org](https://www.fuget.org/)  
  ヘルプドキュメントや逆アセンブルしたコードを見れる
- [.NET Standard 2.0から2.1へのAPI差分(diff)](https://raw.githubusercontent.com/dotnet/standard/master/docs/versions/netstandard2.1_diff.md)
- [.NET Core 2.2から3.0へのAPI差分(diff)](https://github.com/dotnet/core/blob/master/release-notes/3.0/api-diff/README.md)
- [.NET Core 3.1から5.0へのAPI差分(diff)](https://github.com/dotnet/core/tree/master/release-notes/5.0/api-diff/netcoreapp3.1)

## 各ソースコードと破壊的変更

|        | CoreCLR                                                                                                                                                                | CoreFX(BCL)                                                                                                                                                               | 破壊的変更                                                                                   |
| ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| main | [CoreCLR](https://github.com/dotnet/runtime/tree/main/src/coreclr) / [CoreLib](https://github.com/dotnet/runtime/tree/main/src/coreclr/src/System.Private.CoreLib) | [CoreFX](https://github.com/dotnet/runtime/tree/main/src/libraries) / [CoreLib](https://github.com/dotnet/runtime/tree/main/src/coreclr/System.Private.CoreLib/src) |                                                                                              |
| 6.0    | [CorCLR](https://github.com/dotnet/runtime/tree/release/6.0/src/coreclr)                                                                                                                                                                       |                                                                                                                                                                           | [.NET 6.0 での破壊的変更](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/6.0)    |
| 5.0    |  [CorCLR](https://github.com/dotnet/runtime/tree/release/5.0/src/coreclr)                                                                                                                                                                        |                                                                                                                                                                           | [.NET 5.0 の破壊的変更](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/5.0)      |
| 3.1    | [CoreCLR](https://github.com/dotnet/coreclr/tree/release/3.1) / [CoreLib](https://github.com/dotnet/coreclr/tree/release/3.1/src/System.Private.CoreLib)               | [CoreFX](https://github.com/dotnet/corefx/tree/release/3.1/src) / [CoreLib](https://github.com/dotnet/corefx/tree/release/3.1/src/Common/src/CoreLib)                     | [.NET Core 3.1 の破壊的変更](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/3.1) |
| 3.0    |                                                                                                                                                                        |                                                                                                                                                                           | [.NET Core 3.0 の破壊的変更](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/3.0) |
| 2.1    |                                                                                                                                                                        |                                                                                                                                                                           | [.NET Core 2.1 の破壊的変更](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/2.1) |
| 2.0    | [CoreCLR](https://github.com/dotnet/coreclr/tree/release/2.2/src)                                                                                                      | [CoreFX](https://github.com/dotnet/corefx/tree/release/2.2/src)                                                                                                           | [.NET Coreの破壊的変更](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/)         |


- [ソース検索](https://source.dot.net/)
- [.NET Framework referencesource](https://referencesource.microsoft.com/)  
  ライセンスはMICROSOFT REFERENCE SOURCE LICENSE 
- [.NET Framework referencesource@github](https://github.com/microsoft/referencesource)  
  ライセンスはMIT

# ツール

## フリーの逆コンパイラ
- [ILSpy](https://github.com/icsharpcode/ILSpy) ([Microsoft Store版](https://www.microsoft.com/ja-jp/p/ilspy/9mxfbkfvsq13?activetab=pivot:overviewtab))
- [dnSpy](https://github.com/0xd4d/dnSpy)
- [Telerik JustDecompile](https://www.telerik.com/products/decompiler.aspx)
- Ildasm.exe  
  `"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe"`

## スクリプティング
- C# Interactive  
  `"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csi.exe"`  
  (WindowsTerminalなら`"commandline": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\MSBuild\\Current\\Bin\\Roslyn\\csi.exe"`)
- [LINQPad](https://www.linqpad.net/)
   
# バージョン

Symbolを使用して、ソースコード中で`#if NETCOREAPP3_1`のように判定できる。

| TargetFramework | ターゲット フレームワーク モニカー (TFM) | [Symbol](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-if#remarks) | 既定のバージョン |
| --------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ---------------- |
| .NET Framework  |                                          | `NETFRAMEWORK`                                                                                                              |                  |
|                 | net20                                    | `NET20`                                                                                                                     | 7.3 [^1]         |
|                 | net35                                    | `NET35`                                                                                                                     | 7.3 [^1]         |
|                 | net40                                    | `NET40`                                                                                                                     | 7.3 [^1]         |
|                 | net45                                    | `NET45`                                                                                                                     | 7.3 [^1]         |
|                 | net451                                   | `NET451`                                                                                                                    | 7.3 [^1]         |
|                 | net452                                   | `NET452`                                                                                                                    | 7.3 [^1]         |
|                 | net46                                    | `NET46`                                                                                                                     | 7.3 [^1]         |
|                 | net461                                   | `NET461`                                                                                                                    | 7.3 [^1]         |
|                 | net462                                   | `NET462`                                                                                                                    | 7.3 [^1]         |
|                 | net47                                    | `NET47`                                                                                                                     | 7.3 [^1]         |
|                 | net471                                   | `NET471`                                                                                                                    | 7.3 [^1]         |
|                 | net472                                   | `NET472`                                                                                                                    | 7.3 [^1]         |
|                 | net48                                    | `NET48`                                                                                                                     | 7.3 [^1]         |
| .NET Standard   |                                          | `NETSTANDARD`                                                                                                               |                  |
|                 | netstandard1.0                           | `NETSTANDARD1_0`                                                                                                            | 7.3              |
|                 | netstandard1.1                           | `NETSTANDARD1_1`                                                                                                            | 7.3              |
|                 | netstandard1.2                           | `NETSTANDARD1_2`                                                                                                            | 7.3              |
|                 | netstandard1.3                           | `NETSTANDARD1_3`                                                                                                            | 7.3              |
|                 | netstandard1.4                           | `NETSTANDARD1_4`                                                                                                            | 7.3              |
|                 | netstandard1.5                           | `NETSTANDARD1_5`                                                                                                            | 7.3              |
|                 | netstandard1.6                           | `NETSTANDARD1_6`                                                                                                            | 7.3              |
|                 | netstandard2.0                           | `NETSTANDARD2_0`                                                                                                            | 7.3              |
|                 | netstandard2.1                           | `NETSTANDARD2_1`                                                                                                            | 8.0              |
| .NET Core       |                                          | `NETCOREAPP`                                                                                                                |                  |
|                 | netcoreapp1.0                            | `NETCOREAPP1_0`                                                                                                             |                  |
|                 | netcoreapp1.1                            | `NETCOREAPP1_1`                                                                                                             |                  |
|                 | netcoreapp2.0                            | `NETCOREAPP2_0`                                                                                                             | 7.3              |
|                 | netcoreapp2.1                            | `NETCOREAPP2_1`                                                                                                             | 7.3              |
|                 | netcoreapp2.2                            | `NETCOREAPP2_2`                                                                                                             | 7.3              |
|                 | netcoreapp3.0                            | `NETCOREAPP3_0`                                                                                                             | 8.0              |
|                 | netcoreapp3.1                            | `NETCOREAPP3_1`                                                                                                             | 8.0              |
| .NET 5          | net5.0                                   | `NET5_0`                                                                                                                    | 9.0              |
| .NET 6          | net6.0                                   | `NET6_0`                                                                                                                    | 10              |

[^1]: 古いcsproj形式では個別指定

# 言語仕様

[wikipedia](https://ja.wikipedia.org/wiki/C_Sharp)の方が情報がそろっているので、そちらを適宜参照。

## 本家
https://github.com/dotnet/csharplang

## ECMA(C# 5.0)
https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-334.pdf

## JISX3015(C# 1.2相当)
https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?show&jisStdNo=X3015

## docs.microsoft.com(日本語)
https://github.com/dotnet/csharplang.ja-jp から生成されている。

- [C# 6.0 のドラフト仕様](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-specification/introduction)
- C# 7.0 仕様の提案
    - [パターン マッチング](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.0/pattern-matching)
    - [ローカル関数](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.0/local-functions)
    - [out 変数宣言](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.0/out-var)
    - [throw 式](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.0/throw-expression)
    - [バイナリリテラル](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.0/binary-literals)
    - [桁区切り文字](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.0/digit-separators)
- C# 7.1 仕様の提案
    - [非同期 main メソッド](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.1/async-main)
    - [既定値式](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.1/target-typed-default)
    - [タプル名を推定する](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.1/infer-tuple-names)
    - [ジェネリックを使用したパターンマッチング](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.1/generics-pattern-match)
- C# 7.2  仕様の提案
   - [読み取り専用の参照](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.2/readonly-ref)
   - [ref-like 型のコンパイル時の安全性](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.2/span-safety)
   - [末尾以外の名前付き引数](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.2/non-trailing-named-arguments)
   - [`private protected`](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.2/private-protected)
   - [条件付き ref](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.2/conditional-ref)
   - [先頭の桁区切り文字](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.2/leading-separator)
- C# 7.3 仕様の提案
    - [アンマネージドジェネリック型制約](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.3/blittable)
    - [移動可能/移動不可能なコンテキストに関係なく、`fixed`フィールドのイデックス付けでピン留めを必要とすべきではない](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.3/indexing-movable-fixed-fields)
    - [パターンベースの `fixed` ステートメント](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.3/pattern-based-fixed)
    - [ref ローカルの再割り当て](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.3/ref-local-reassignment)
    - [stackalloc 配列初期化子](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.3/stackalloc-array-initializers)
    - [自動実装プロパティのフィールドを対象とした属性](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.3/auto-prop-field-attrs)
    - [初期化子における式の変数](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.3/expression-variables-in-initializers)
    - [タプルの等値(==) および非等値 (!=)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.3/tuple-equality)
    - [オーバーロード候補の改善](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-7.3/improved-overload-candidates)
- C# 8.0 の新機能
  - [読み取り専用メンバー](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#readonly-members)
  - [既定のインターフェイス メソッド](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#default-interface-methods)
  - [パターン マッチングの拡張機能](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#more-patterns-in-more-places):
      - [switch 式](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#switch-expressions)
      - [プロパティのパターン](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#property-patterns)
      - [タプル パターン](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#tuple-patterns)
      - [位置指定パターン](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#positional-patterns)
  - [using 宣言](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#using-declarations)
  - [静的ローカル関数](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#static-local-functions)
  - [破棄可能な ref 構造体](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#disposable-ref-structs)
  - [Null 許容参照型](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#nullable-reference-types)
  - [非同期ストリーム](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#asynchronous-streams)
  - [非同期の破棄可能](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#asynchronous-disposable)
  - [インデックスと範囲](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#indices-and-ranges)
  - [null 合体割り当て](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#null-coalescing-assignment)
  - [構築されたアンマネージド型](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#unmanaged-constructed-types)
  - [入れ子になった式の stackalloc](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#stackalloc-in-nested-expressions)
  - [verbatim 補間文字列の拡張](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8#enhancement-of-interpolated-verbatim-strings)
- [C# 9.0 の新機能](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9)
- [C# 10 の新機能](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-10)

# [歴史](https://github.com/dotnet/csharplang/blob/master/Language-Version-History.md)

- C# 8.0 - .NET Core 3.0 and Visual Studio 2019 version 16.3 
- C# 7.3 - Visual Studio 2017 version 15.7
- [C# 7.2](https://blogs.msdn.microsoft.com/dotnet/2017/11/15/welcome-to-c-7-2-and-span/) - Visual Studio 2017 version 15.5
- [C# 7.1](https://blogs.msdn.microsoft.com/dotnet/2017/10/31/welcome-to-c-7-1/) - Visual Studio 2017 version 15.3
- [C# 7.0](https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/) - Visual Studio 2017
- [C# 6](https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6) - Visual Studio 2015
- [C# 5](https://blogs.msdn.microsoft.com/mvpawardprogram/2012/03/26/an-introduction-to-new-features-in-c-5-0/) - Visual Studio 2012
- [C# 4](https://msdn.microsoft.com/magazine/ff796223.aspx) - Visual Studio 2010
- [C# 3](https://msdn.microsoft.com/library/bb308966.aspx) - Visual Studio 2008
- [C# 2](https://msdn.microsoft.com/library/7cz8t42e(v=vs.80).aspx) - Visual Studio 2005
- [C# 1.2](https://docs.microsoft.com/dotnet/csharp/whats-new/csharp-version-history#c-version-12) - Visual Studio .NET 2003
- [C# 1.0](https://en.wikipedia.org/wiki/Microsoft_Visual_Studio#.NET_.282002.29) - Visual Studio .NET 2002