• システム開発に関わる内容をざっくりと書いていく

C#の”!”の使い方

C#の”!”(エクスクラメーション)は、コード内でさまざまな用途で使われる記号で、主に論理否定やnullチェックの意味を持つ。ここでは、”!”がどのように使われるかを具体例とともに解説する。


1. 論理否定(Logical NOT)

“!”の基本的な使い方として、論理否定がある。ブール値に対して使用し、truefalseに、falsetrueに変える。

例:

csharp
bool isActive = false;
if (!isActive)
{
Console.WriteLine("isActiveはfalseです");
}

ここでは、isActivefalseのときに!isActivetrueとなるため、条件が成立してメッセージが表示される。


2. null許容型の非nullアサーション演算子(Null Forgiving Operator)

C# 8.0で導入された”!”は、変数がnullでないことを明示するための演算子としても使われる。主に、null許容型(nullable)を扱う場面で使用され、コンパイラに「この変数はnullではない」と伝えるために使う。これにより、コンパイル時の警告を無視できる。

例:

csharp
string? name = GetName();
Console.WriteLine(name!.Length); // nameがnullでないことをアサート

name!とすることで、nameがnullでないことを保証する。しかし、このアサーションが誤っていると、実行時にNullReferenceExceptionが発生するため注意が必要。


3. パターンマッチングでの否定パターン(Not Pattern)

C# 9.0以降では、パターンマッチングにおいて!を使った否定パターンが使用可能。is演算子と組み合わせることで、特定の型や値でないことを判定できる。

例:

csharp
object obj = "Hello";
if (obj is not int)
{
Console.WriteLine("objはintではない");
}

この場合、objint型でない場合に条件が成立し、メッセージが表示される。


4. 非nullアサーションとnull許容リファレンス型

C#では、null許容リファレンス型(nullable reference types)を有効にすると、nullの可能性がある変数について警告が表示されるようになる。!を使うことで、その変数がnullでないと明示的に示し、警告を回避することが可能。

例:

csharp
#nullable enable
string? optionalName = GetName();
string nonNullableName = optionalName!; // nullチェックを無視
Console.WriteLine(nonNullableName);

optionalName!とすることで、optionalNameがnullでないと仮定して次の処理が行われる。nullが実際に入っていると、実行時にエラーとなる点に注意が必要。


まとめ

C#の”!”には、論理否定、非nullアサーション、パターンマッチングでの否定など多様な用途がある。論理否定としての基本的な使い方から、nullable対応のための非nullアサーションや、パターンマッチングでの否定パターンまで、バージョンアップに伴い”!”の用途が拡張されている。特に非nullアサーション演算子としての”!”は、null参照エラーを回避するために慎重に使用する必要がある。