【C#】コレの名前、なんだっけ？【用語集】

C#で名称を忘れやすい語句について、簡単な解説・用例とともにまとめました。
実装やコードレビューなどの場面でお役に立てば幸いです。

## `///` [ドキュメンテーションコメント](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/xmldoc/)
クラスやメンバーの説明を記述するのに利用する。
```c#
/// <summary>
///  This class performs an important function.
/// </summary>
public class MyClass {}
```

## `@` [逐語的識別子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/tokens/verbatim)
先頭に付加することで、例外的に予約語を識別子とすることができる。
```c#
string @string = "John";
Console.WriteLine(@string); // John
```

## `@""` [逐語的文字列リテラル](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/tokens/verbatim)
`\`をエスケープシーケンスと見なさず、そのままの表記で解釈する。
```c#
string filename = @"c:\documents\files\u0066.txt";
Console.WriteLine(filename); // c:\documents\files\u0066.txt
```

## `$"{}"` [文字列補間](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/tokens/interpolated)
`{}`の中が式として解釈され、その結果の文字列表現で置き換えられる。
```c#
string name = "Mark";
Console.WriteLine($"Hello, {name}!"); // Hello, Mark!
```

## `T?` [Null許容値型（Nullable型）](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/nullable-value-types)
値型`T`でnullを表現したい場合に利用する。
```c#
int? num = null;
bool? flag = null;
```

## `?.` [Null条件演算子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/member-access-operators#null-conditional-operators--and-)
`a`がnullの場合、`a?.x`の結果はnullとなる。
`a`がnull以外の場合、`a?.x`の結果は`a.x`の結果と同様となる。
```c#
string str1 = "test";
Console.WriteLine(str1?.Length); // 4
Console.WriteLine(str1.Length); // 4

string str2 = null;
Console.WriteLine(str2?.Length); //
Console.WriteLine(str2.Length); // System.NullReferenceException
```

## `!` [Null免除演算子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-forgiving)
式がnullでないことを明示し、コンパイラに対して警告を免除させる。
```c#
public static void Main()
{
    Person? p = Find("John");
    if (IsValid(p))
    {
        Console.WriteLine($"Found {p!.Name}");
    }
}

public static bool IsValid(Person? person)
    => person is not null && person.Name is not null;
```

## `^m` [末尾からのインデックス演算子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/member-access-operators#index-from-end-operator-)
末尾からm番目の要素を示す。たとえば、`^1`は最後の要素を示す。
```c#
var lines = new List<string> { "one", "two", "three", "four" };
Console.WriteLine(lines[^2]);  // three
```

## `m..n` [範囲演算子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/member-access-operators#range-operator-)
m～n番目の要素（ただし、n番目を含まない）を示す。
```c#
int[] numbers = new[] { 0, 10, 20, 30, 40, 50 };
int[] subset = numbers[1..4];
Console.WriteLine(string.Join(" ", subset)); // 10 20 30
```

## `[][]` [ジャグ配列](https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/arrays/jagged-arrays)
要素ごとにサイズが異なる（不揃いな）多次元配列。
```c#
int[][] jaggedArray = new int[][]
{
    new int[] { 1, 3, 5, 7, 9 },
    new int[] { 0, 2, 4, 6 },
    new int[] { 11, 22 }
};
```

## `++` [インクリメント演算子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/arithmetic-operators#increment-operator-)
オペランドに対して、1を加算する。
```c#
int i = 3;
i++;
Console.WriteLine(i); // 4
```

## `--` [デクリメント演算子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/arithmetic-operators#decrement-operator---)
オペランドに対して、1を減算する。
```c#
int i = 3;
i--;
Console.WriteLine(i); // 2
```

## `?:` [条件演算子（三項演算子）](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/conditional-operator)
条件式の評価結果（真偽）に応じて、2つの式のいずれかの結果を返す。
```c#
string GetWeather(double temp) => temp < 20.0 ? "Cold." : "Perfect!";
Console.WriteLine(GetWeather(15));  // Cold.
Console.WriteLine(GetWeather(27));  // Perfect!
```

## `??` [Null合体演算子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-coalescing-operator)
左側のオペランドがnullでない場合には、左側のオペランドの値を返す。
左側のオペランドがnullの場合には、右側のオペランドの値を返す。
```c#
int a = 2;
int? b = null;
Console.WriteLine(a ?? -1);  // 2
Console.WriteLine(b ?? -1);  // -1
```

## `??=` [Null合体代入演算子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-coalescing-operator)
左側のオペランドがnullの場合のみ、右側のオペランドの値を左側のオペランドに代入する。
```c#
List<int> numbers = null;
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // 5
```

## `#` [プリプロセッサディレクティブ](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/preprocessor-directives)
他のコードと区別するために、`#`で始まるキーワード。コンパイラに対する命令を表す。
```c#
#define DEBUG

#if DEBUG
   Console.WriteLine("DEBUG");
#endif
```

## `{}` [オブジェクト初期化子](https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers#object-initializers)／[コレクション初期化子](https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers#collection-initializers)
オブジェクトやコレクションをインスタンス化するタイミングで、まとめてメンバーを割り当てる。
```c#
// オブジェクト初期化子
Cat cat = new Cat { Age = 10, Name = "Fluffy" };

// コレクション初期化子
List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };  

// インデックス初期化子
var planet = new Dictionary<string, string>
{
    ["Earth"] = "地球",
    ["Jupiter"] = "木星",
    ["Mercury"] = "水星"
};
```

## `~` [ファイナライザー](https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/finalizers)
オブジェクトが破棄されるタイミングで自動的に実行される。
```c#
class Car
{
    ~Car()  // finalizer
    {
        // cleanup statements...
    }
}
```

## `new {}` [匿名型](https://learn.microsoft.com/ja-jp/dotnet/csharp/fundamentals/types/anonymous-types)
`new`演算子とオブジェクト初期化子`{}`を使用することで、名前のない型を初期化することができる。
```c#
var v = new { Amount = 108, Message = "Hello" };
Console.WriteLine(v.Amount); // 108
Console.WriteLine(v.Message); // Hello
```

## `{ get; set; }` [自動実装プロパティ](https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties)
アクセサ（get／set）に特別なロジックが必要ないときに、プロパティを簡潔に宣言できる。
```c#
public class Customer
{
    public string Name { get; set; } 
    public int CustomerId { get; set; }

    public Customer(string name, int id)
    {
        Name = name;
        CustomerId = id;
    }
}
```

# 参考サイト
https://learn.microsoft.com/ja-jp/dotnet/csharp/