C#のビックリマーク(!)の使い方とアンチパターン

June 08, 2023

top画像

C#のプログラミング言語において、ビックリマーク(!)は非常に重要な役割を果たしています。ビックリマークは「論理否定演算子」として、また「null 許容参照型」の扱いにおいて用いられます。

論理否定演算子としてのビックリマーク(!)

論理否定演算子としてのビックリマークは、論理値(真または偽)を反転させます。

例えば、以下のコードを見てみましょう。

bool isTrue = true;
Console.WriteLine(!isTrue);  // Outputs: False

このコードでは、isTrueという真(True)のブール値に対して、ビックリマークを用いて論理否定を行っています。その結果、出力は「False」となります。

null 許容参照型とビックリマーク(!)

C# 8.0 以降、ビックリマークは null 許容参照型に対しても使用されます。

具体的には、ビックリマークは null が代入されないことを保証する参照型を示します。

以下の例をご覧ください。


string? nullableString = null;
string nonNullableString = nullableString!;  // This may cause a null reference exception

このコードでは、nullableStringは null を許容する文字列型です。しかし、ビックリマークを使って null 許容参照型から null を許容しない参照型への変換を試みています。これは null 参照例外を引き起こす可能性があるため、注意が必要です。

アンチパターン

ビックリマークの使用には注意が必要です。論理否定演算子として用いる際には、複雑な条件式の中で使われると、コードの可読性を著しく低下させる可能性があります。

また、null 許容参照型に対して用いる際には、null 参照例外を防ぐために適切な null チェックが必要です。適切なチェックが行われていない場合、以下のようなコードはアンチパターンとなります。


string? nullableString = null;
string nonNullableString = nullableString!;
Console.WriteLine(nonNullableString.Length);  // This will cause a null reference exception

このコードでは、null を許容する文字列(nullableString)が null であるにも関わらず、ビックリマークを使用して null を許容しない文字列(nonNullableString)に変換しようとしています。これにより、nonNullableString.Lengthを評価するときに null 参照例外が発生します。


まとめ

この記事では、C#のビックリマーク(!)の使い方とそのアンチパターンについて解説しました。

ビックリマークは論理否定演算子として、また null 許容参照型の扱いにおいて用いられます。しかし、これらの使用法には注意が必要で、特に null 許容参照型に対する適切な null チェックが行われていない場合、コードはアンチパターンとなります。

C#をより効果的に、かつ安全に使用するためには、ビックリマークの正しい使い方を理解し、適切なコーディング技術を習得することが重要です。


Profile picture

Written by Mittsu
ベンチャー企業のしがないエンジニア。趣味はサッカーとTCG.

© 2024