コードインスペクション:条件付き呼び出し内での意図しない変更の可能性
このインスペクションは、条件文 (例: Debug.Assert()) 内のメソッド呼び出しによって、意図しない副作用が発生したり、コードの明確さが低下したりする可能性があるケースを検出します。
メソッドがオブジェクトの状態を変更し、その戻り値が条件文内で使用される場合、ロジックが読みにくくなる可能性があります。 これにより保守性が低下し、意図しないエラーが発生する可能性が高まります。
次の例を考えてみましょう。
using System.Collections.Generic;
using System.Diagnostics;
class Program
{
void Example()
{
var set = new HashSet<int>();
Debug.Assert(set.Add(1)); // Inspection warning here
_ = set.Count;
}
}
この例
HashSet.Addメソッドは値の追加を試みることでコレクションを変更し、その戻り値 (bool) は操作が成功したかどうかを示します。この戻り値を
Debug.Assert呼び出しで直接使用すると、HashSet.Addの詳細を理解しなければアサーションの意図が不明瞭になるため、読者を混乱させる可能性があります。条件文内でコレクションを変更することは、意図しない副作用が発生したり、意図したロジックが誤って解釈されたりする可能性があるため、通常は非標準的な方法です。
このインスペクションに対処し、コードの明確さを向上させるには、次のアプローチを検討してください。
わかりやすくするためにリファクタリングする: メソッド呼び出しの結果を適切に名前の付いた変数に抽出し、その目的を明示的にします。
bool wasAdded = set.Add(1); Debug.Assert(wasAdded);意図と必要性を確認する: コレクションのアサーションまたは変更が不要または誤解を招く場合は、コードを簡素化するためにリファクタリングまたは削除することを検討してください。
これらの推奨事項に従うことで、コードの読みやすさが向上し、曖昧さが軽減され、条件文の意図がコードを保守するすべてのユーザーに明確になります。
2026 年 6 月 12 日