if (text == null) // or string.IsNullOrEmpty for strings
throw new ArgumentNullException(nameof(text));
foreach (var c in text)
{
// ...
}
:
私は、広く使われている一般的な良い習慣を使用することをお勧めしますこのC#
の機能を理解するには、内部コードforeach
を理解する必要があります。 foreach
文の式の右側部分はIEnumerable(<T>)
インタフェースを実装する必要があり、全体のループは、内部的に、このような単純なwhile
、何かである:
// here can be NullReferenceException
var en = text.GetEnumerator();
while(en.MoveNext())
{
var c = en.Current;
{
...
}
}
あなたが見ることができるように、このコード内のポイントがありますNRE
することができます
if (text.IsNullOrWhitespace())
{
throw new ArgumentNullException(nameof(text));
}
// while loop here or text.SomeLinqCodeHere()
が本当に不要ではありません、ここでのコードのいくつかの行があり、いくつかのエントロピーを追加し、:あなたはこのような列挙前にループ全体またはEnumerable
extensions classを、チェックする必要があるので、発生本当の価値はありません。 foreach
シンプルなそれは本当に意見ベースのコードの規格についての決定が、この機能の真の目的の場合には、このように、?.
operatorのように、C#7
に他の新しいもので、それを連鎖さ:投げるような場合には
int? length = customers?.Length ?? throw new ...;
Customer first = customers?[0] ?? throw new ...;
int? count = customers?[0]?.Orders?.Count() ?? throw new ...;
int? length = customers?.Length; // should not be null
Customer first = customers?[0]; // should not be null
int? count = customers?[0]?.Orders?.Count(); // should not be null
が、それはあなたのコードのためのいくつかの厳格な契約のようなルールを追加します。例外は、コードの行の末尾にコメントすることは似ています。このような式でforeach
ループのパフォーマンスについては
、すでに言ったように、それは列挙子を取得することは、一度だけ発生するよう苦しみ、そして
前の実ループしません。
テスト時にパフォーマンスにどのような影響がありましたか?あなたはそれを試したのですか?あなた自身であなたの質問に対する答えを理解するためのテストでは不十分であった理由を説明してください。あなたがテストしたことをはっきりと示している良い[mcve]が含まれるように質問を修正し、あなたのテストについて正確に理解できないことについての詳細な説明を含めてください。 –
1回。 'text'がヌルの場合、条件文は一度ヒットします。これは説明なしで論理的でなければなりません。ループしている場合は、列挙子がループされているために1回だけ表示されます。 –
@PeterDuniho質問の枠組みが間違っているか分かりません。 – Svek