C#の”!”(エクスクラメーション)は、コード内でさまざまな用途で使われる記号で、主に論理否定やnullチェックの意味を持つ。ここでは、”!”がどのように使われるかを具体例とともに解説する。
“!”の基本的な使い方として、論理否定がある。ブール値に対して使用し、true
をfalse
に、false
をtrue
に変える。
csharpbool isActive = false;
if (!isActive)
{
Console.WriteLine("isActiveはfalseです");
}
ここでは、isActive
がfalse
のときに!isActive
がtrue
となるため、条件が成立してメッセージが表示される。
C# 8.0で導入された”!”は、変数がnull
でないことを明示するための演算子としても使われる。主に、null許容型(nullable)を扱う場面で使用され、コンパイラに「この変数はnullではない」と伝えるために使う。これにより、コンパイル時の警告を無視できる。
csharpstring? name = GetName();
Console.WriteLine(name!.Length); // nameがnullでないことをアサート
name!
とすることで、name
がnullでないことを保証する。しかし、このアサーションが誤っていると、実行時にNullReferenceException
が発生するため注意が必要。
C# 9.0以降では、パターンマッチングにおいて!
を使った否定パターンが使用可能。is
演算子と組み合わせることで、特定の型や値でないことを判定できる。
csharpobject obj = "Hello";
if (obj is not int)
{
Console.WriteLine("objはintではない");
}
この場合、obj
がint
型でない場合に条件が成立し、メッセージが表示される。
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参照エラーを回避するために慎重に使用する必要がある。