C#String.IsNullOrEmpty:良いか悪いですか?
-
18-09-2019 - |
質問
私は、セッション変数でString.IsNullOrEmptyを誤用職場での事件の後、私の仲間の同僚は今String.IsNullOrEmptyの私の使用を受け入れることを拒否します。いくつかの研究の後、明らかにMSDNにIsNullOrEmptyのために記載されているバグが(あります<のhref =「http://msdn.microsoft.com/en-us/library/system.string.isnullorempty(VS.80).aspx」のrel = "nofollowをnoreferrer">リンクする)()下のメモを読みます:
2006年4月4日の時点で、バグがあります これを作ること(JITで可能) 最適化がされたときにメソッドが失敗します オン。両方に影響を与えることが知られています C#とVBます。
詳しい情報はここで見つけることができます(リンクする) 。マイクロソフトバグは「おそらく」ポストシャチ固定されているが、残念ながら私の雇用はまだVS2005を使用しています。問題は2008+に固定されている場合でも、それをすること。それは私と一緒にだけで大丈夫です。
なぜのないの私にIsNullOrEmptyと私のコードの私の同僚の拒否は、盲目無知(IMO)ですが、彼は確かにセッション変数を持つ悪用以外にそれを使用するために私に言うことはできません。私はすべての一切の問題に我々のコードの上にIsNullOrEmptyを使用しました。個人的に、私は1つのステートメントで2つの物事のほかに、それははるかに読みやすい見つけます。
テーマに関する意見をグーグルでの後、私はプロ/コンスタンスを取るのサイトを見つけました。ここで私はこのことについて読んだのサイトをいくつか紹介します:
https://blog.rthand.com/post/2006 /06/22/1063.aspxする
http://www.omegacoder.com/?p=105する
一つのサイト( http://dotnetperls.com/isnullorempty の)はかなりの方法(私見)を合計しますほかます:
ここでは、そのIsNullOrEmptyを見て 文字列型の方法で、どの 比較的良好とを提供してくれます かどうかをチェックする効率的な方法 文字列が保存または使用がOKです。しかしながら、 パフォーマンスのために、それができると便利 マニュアルはnullチェックを使用します。空の文字列 また、他の方法で試験することができると ここでの私の研究は、そのチェックを示してい 長さは最速です。
バグフィックスが所定の位置にあると仮定すると、(と正しく動作)VS2008 / 2010の/ etcインチ、VS2005とし、超えString.IsNullOrEmptyを使用するには、のないのいずれかの理由があるのでしょうか?私は、これは、このような他愛ない方法を少し超える過剰に見えるかもしれません実現が、私は誰もが別の説明を持っている場合に行くと舞台裏ではありませかどうかを知りたいと思います。
解決
この問題は、.NET 2.0 SP1で修正されました。今、その使用を避ける理由はありません。
あなたは.NET 2を使用している場合は、、あなたはとにかく多くの他の理由のためにSP1を持っている必要があります - 私はもはや存在しないバグのためにこれを回避するための理由を見ていない。
。他のヒント
私は前にそのバグについて聞いた、と私はそれは本当に何もしないの例のようにコードだけで、任意の実際のコードで発生したことがない収集できるものとしました。それは関係なく、あなたが文字列をチェックする方法を生じるように加えて、バグは、IsNullOrEmpty方法自体ではありません。
この方法は、正確にあなたが何をしたいのかない場合は、は、あなたはそれを使用する必要があります。ただし、空の文字列をチェックするためにあらゆる状況でそれを使用しないでください。時には、あなたはそれがnullだ場合、文字列が空でないかどうかをチェックします。
文字列変数がnullの場合、これは単にコードブロックをスキップします。
if (!String.IsNullOrEmpty(str)) { ... }
文字列変数がnullの場合、これは例外が発生します。
if (str.Length > 0) { ... }
変数はnullにすることになっていない場合は、、あなたはおそらく例外の代わりに、空の文字列としてnull値を処理するコードをしたいです。何かが間違っている場合は、元に戻って問題を追跡するために困難になりますので、できるだけ早期にそれをキャッチしたい長い例外が原因である。
あなたはこのようなものをテストするために、ヌル文字列を渡し、空の文字列と1を渡しユニットテストを書き、2008年にVS2005にし、後にそれを実行し、何が起こったのか見ることができました。
リンクでそのバグレポートでそれは述べ含まれます:
このバグは、Microsoft .NET Framework 2.0のService Pack 1(SP1)で修正されています。
それはあなたがいる限り、あなたがインストールされている.NET 2用SP1を持っているようにVS 2005を使用している場合、それは問題ではないはず場合があるので。
CodingHorror によってこのポストをチェックアウトし、それを使用するかどうかについてはA>。
私たちはstring.IsNullOrEmpty
ための拡張メソッドを使用します:
public static bool IsNullOrEmpty(this string target)
{
return string.IsNullOrEmpty(target);
}
バグ修正コードの唯一の行であり、それはいくつかの以前のバージョンで壊れたとしても、このアプローチを使用します。
はNULLであるかもしれない文字列インスタンスのメソッドを使用することができるという追加のユーティリティます:
string myString = null;
if (myString.IsNullOrEmpty())
{
// Still works
}
私はそれがSP1で修正されましたが、とにかくあなたがあなた自身のnullまたは空のメソッドを作成することができますかなり確信している:)
任意の言語またはその一部と同じように、それはすべての長所/短所を知り、その情報に基づいて教育を受けた決定を下すことです。私見ます。
、私は通常、個別の条件をチェックし、別の例外がスロー:null参照のためArgumentNullException
や、APIの仕様によっては、空の文字列のためのArgumentException
を。この場合、String.IsNullOrEmpty
を使用することで、これらの二つの別々のエラー条件を区別することはできません。
if (str == null)
{
throw new ArgumentNullException("str");
}
if (str == string.Empty)
{
throw new ArgumentException("The string cannot be empty.", "str");
}
、これだけやるだけのチェックを行います静的メソッドを持ってするのは簡単です
public static bool isNull(String s) {
return s == null || s.trim().length == 0;
}
修正するのは比較的簡単であるべき何かの上に大きな問題になってんのポイントます。
あなたは別と1つの静的メソッドの置き換えグローバルを行うことができますがあなたは、どこにでもそれを変更する必要はありません。
私は人々がString.Emptyのを使用する理由、それは初期化された文字列だと、この概念はどこでも唯一の.Netフレーム内に存在する、これは0(DBサーバは、この間の非常に明確destinctionを作るのLENと有効な文字列であるので、それは良いことではないだろうあなたがnullのチェックのロジックを持っていますが、あなたが取得し、空の文字列ならば)文句を言うでしょう。 私は何とかそれを奨励するためstring.IsNullOrEmptyは私が今まで見た中でトップ5最悪のプラクティス/機能の一つであることを考える/それは彼らの文字列を初期化するために、OKの人を見ますと、 ヌルとして処理することができます。この機能は追加されていなかったはずですし、私は、.NETの連中がとにかく必要と空の文字列は誰:)それを段階的に廃止しようとするべきだと思いますか?私が持っていない限りため、既存のプロジェクトがそれを使用し、私はそれを使用したことがありません。