既にquestion on SO about "possible multiple enumerations"がありますが、この質問はより具体的です。"IsNullOrEmpty"チェックでも "IEnumerableの複数の列挙が可能"という警告が表示される
入力としてIEnumerable<string>
を受け取り、その要素のそれぞれに対して所定の方法を実行する以下の方法を検討してください:IsNullOrEmpty
は
public static bool SomeMethod(IEnumerable<string> enumerable)
{
if (enumerable.IsNullOrEmpty())
{
// throw exception.
}
else
{
return (enumerable.All(SomeBooleanMethod));
}
}
を
return (!ReferenceEquals(enumerable, null) || enumerable.Any());
問題はReSharperが「可能な複数のIEnumerableの列挙」について警告していますが、実際に問題があるかどうかはわかりません。
私は警告の意味を理解していますが、無効または空の場合に例外をチェックしてスローする必要が本当にある場合は、この状況で本当に何ができますか?
空のシーケンスが渡された場合、なぜこのメソッドをスローするのですか? 「この(空の)シーケンスのすべてのメンバーに何かする」という意味は完全に明白ですが、そうではありませんか?また、 '== null'ではなく' ReferenceEquals() 'を使う特別な理由はありますか? – AakashM
これは実際にはありませんが、今はこれがコンストラクタであると想像してください。空のシーケンスからオブジェクトを構築できない場合、exceptioを投げてはいけませんか? – User
確かに、もしあなたが何もできないのであれば、 *一般的に、私は、空の配列は空でない配列と同じように扱うべきだと言っています。 'List <>'は、例えば、空のシーケンスから構築することができます。もちろん私は一般的な話だけです。あなたはあなたの状況の詳細*を知っています。 – AakashM