2009-11-06 22 views
14

セッション変数でString.IsNullOrEmptyを誤って使用した事件の後、同僚の同僚がString.IsNullOrEmptyの使用を受け入れないようになりました。いくつかの研究の後、明らかにMSDN(link)にIsNullOrEmptyのために記載されたバグ(下のメモを読む)があります:2006年4月4日のようC#String.IsNullOrEmpty:良いか悪いですか?

、それは作る(JITで可能)バグ あり最適化が の場合、この メソッドは失敗します。 C#とVBの両方に影響することが知られています。

詳細については、こちら(link)をご覧ください。マイクロソフトでは、このバグはOrcasの後に「おそらく」修正されていますが、残念ながら私の雇用主はまだ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 メソッドを見ています。 は、 という効率的な方法で、 文字列は保存または使用することができます。ただし、パフォーマンスのために を入力すると、 の手動ヌルチェックを使用する方が良い場合があります。空の文字列 も他の方法でテストすることができます。 私の研究では、 の長さが最も速いことを示しています。

バグフィックスが所定の位置にあると仮定すると、(と正しく動作)/ 2010 VS2008の/ etc。で、VS2005とし、超えString.IsNullOrEmptyを使用する理由ないはありますか?私はこのような馬鹿げた小さな方法の上で、これはちょっと残忍すぎるように思えるかもしれませんが、何かが起こっているかどうか、誰かが別の説明をしているかどうかを知りたいと思います。

答えて

24

この問題は.NET 2.0 sp1で修正されました。今、その使用を避ける理由はありません。

.NET 2を使用している場合は、他の多くの理由でsp1を使用する必要があります。これは、もはや存在しないバグに対してこれを回避する理由はありません。それはあなたのバージョンで壊れている場合

+0

ありがとうございます。サービスパックがまだインストールされていない場合は、サービスパックを入手してください。私はジャンプする必要があるだろうが、どちらの方法でも、私たちのWebサーバー上の最新のサービスパックを実行する必要がありますすべてのフープのかわからない。ありがとう! – osij2is

0

が、これだけやるだけのチェックを行います静的メソッドを持ってするのは簡単です:

public static bool isNull(String s) { 
    return s == null || s.trim().length == 0; 
} 

何かの上に大きな問題になってんのポイントその修正するのが比較的容易でなければならない。

静的メソッドをグローバルに置き換えることはできますが、どこでも変更する必要はありません。

+0

フレームワークの機能を複製する理由はありません。これは、ネット2.0sp1で修正されたバグです - それはなぜ今避けてください? –

+0

ありがとうございます、はい私は同意します。とても些細なものよりも大きなものに入る必要はありませんが、パッチが当てられている限り、私はそれを使用しない*理由を見つけることができませんでした。交換コードをありがとう。私はそれを実装するかもしれない。 – osij2is

+0

@Reed Copsey - 影響を受けた場合、.NET2sp1にアップグレードしていない可能性があります。確かに、彼らはアップグレードする必要がありますが、それほど些細な事について戦うのではなく、単に回避しなければならない。 –

4

あなたはこのようなものをテストし、2008年にVS2005にし、後にそれを実行し、でそのバグレポートでは

+0

残念ながら、私の現在の雇用主は実際に単体テストを実装していません。私はチャンスではなく、アイデアのおかげでジャンプしないと言っているわけではありません。たぶん私がマネジメントに与えるべき単なるもう一つの理由です。 – osij2is

2

を何が起こったかを見るためにnull文字列を渡し、空の文字列と1を渡しユニットテストを書くことができあなたがそれを含むリンク状態:

このバグは、Microsoft .NET Framework 2.0 Service Pack 1(SP1)で修正されています。

これは、SP1 for .NET 2がインストールされている限り、VS 2005を使用しているかどうかは関係ありません。

これを使用するかどうかは、post by CodingHorrorをご覧ください。

1

が、私はそれはSP1で修正されましたかなり確信しているが、とにかくあなたがあなた自身のnullまたは空のメソッド:)任意の言語またはその一部と同じように

1

を作成することができ、それはすべての長所/短所を知り、作りについてですその情報に基づいて教育された意思決定を行います。私見では。

+0

"賛否両論を知り、その情報に基づいて賢明な決定を下すことがすべてです。" - それじゃないの?なぜ*私はここに頼んでいるの? * *と*教育*決定する*か? – osij2is

+0

@ osij2is - 私のコメントは、まったく侮辱的なものではありませんでした。他の人はすでにバグが修正されていると述べていたので、答えを繰り返す必要はないと感じました。私はあなたとあなたの同僚との間の意見の相違について私の見解を単純に入れていました。解決策が完全に受け入れ可能であることがわかったら、なぜそれが問題なのかを議論しています.... IMHO :) – jaywon

3

我々はstring.IsNullOrEmptyための拡張メソッドを使用します。

public static bool IsNullOrEmpty(this string target) 
{ 
    return string.IsNullOrEmpty(target); 
} 

は、それはいくつかの以前のバージョンで破ったとしても、このアプローチを使用して、バグ修正は、コードの1行だけです。

、ヌルであるかもしれない文字列インスタンスのメソッドを使用することができるという追加のユーティリティ:私は前にそのバグについて聞いた、と私は集めることができるものから、それはで発生したことがない

string myString = null; 
if (myString.IsNullOrEmpty()) 
{ 
    // Still works 
} 
+0

VS2005は拡張機能では動作しません。私は自分自身でエクステンションを使用する傾向があります –

+0

私はVS2005が問題ではないと思います。彼は.NET 2.0 SP1 SP1フレームワークバージョンを使用しています。 C#3.0から始める拡張メソッドが追加されましたが、2.0のフレームワークライブラリで少し微調整して使用することは可能です:http://geekswithblogs.net/robp/archive/2007/12/20/using-extension-methods-ビジュアルスタジオ2008年のin-net-2.0aspx –

+0

インスタンスがnullのときに拡張メソッドを正常に呼び出すことはできません(今まで)。 –

5

任意の実際のコードは、実際に何もしない例のようなコードでのみ。また、バグはIsNullOrEmptyメソッド自体ではないので、文字列のチェック方法に関係なく発生します。

もしあなたのやり方があなたのやりたいこととまったく同じものなら、それを使うべきです。ただし、空の文字列をチェックするためには、すべての状況でそれを使用しないでください。場合によっては、文字列が空であるか否かだけをチェックしたい場合があります。

文字列変数がnullの場合、これは単にコードブロックをスキップします:

if (!String.IsNullOrEmpty(str)) { ... } 

文字列変数がnullの場合、これは例外が発生します:

if (str.Length > 0) { ... } 

変数である場合は、 nullではないと思われる場合は、null値を空の文字列として扱うコードではなく、例外を必要とします。何かが間違っている場合は、できるだけ早くキャッ​​チしたいと思っています。なぜなら、原因が原因で例外が長くなるほど、問題をソースに戻すのがより難しくなるからです。

+0

なぜ私はいつもIsNullOrEmptyメソッドを好む*好きです。 1つの簡単なステップで2つのアクション。文字列について言えば、ほとんどの人がどちらか一方(空対ヌル)に対してコード化する傾向がありますが、まれに両方ともコード化する傾向があります。私は特定のアプリケーションや移植で多くの経験がなければ、空とヌルの両方をチェックすることを好む。 – osij2is

+0

@ osij2is:コードのセマンティクスについても考えてください。IsNullOrEmptyを使用する場合、参照がnullになることがあることを意味することがあります。参照がnullになることは決してないと、コードが混乱します。 – Guffa

+6

「実際のコードでは決して起こらない」というのは、非常に楽観的な対策です。 – peterchen

-5

なぜ私は人々がstring.Emptyを使用しているのだろうか?それは初期化された文字列であるため、良いことではない&この概念はどこでも.Netフレームにしか存在しないが、これはlenが0の有効な文字列であるこれは、あなたがnullをチェックするロジックを持っていても、空の文字列を取得した場合には不平を言うでしょう)。 私はstring.IsNullOrEmptyが、これまでに見た上位5つの最悪のプラクティス/機能の1つだと思っています。何らかの理由で、文字列を初期化するのが大丈夫だと思われ、 をnullとして扱うことができます。この関数は一度も追加されてはいけません.Netの人はそれを段階的に解消しようとするべきだと思います:)とにかく誰が空の文字列を必要としますか?私はそれを使用していない限り、それを使用したことがない限り、私はそれを使用していない

+0

可能な限り、事実を提供することを検討してください。あなたが少なくとも意見を述べるならば、それを他の人にとって有益なものにするためのある種の根拠を提供してください。 – IInspectable

1

APIで引数チェックを実装するとき、私は通常各条件を別々にチェックし、異なる例外をスローする:ArgumentNullException null参照、仕様、ArgumentException空の文字列です。この場合、String.IsNullOrEmptyを使用しても、これら2つの個別のエラー条件を区別することはできません。

if (str == null) 
{ 
    throw new ArgumentNullException("str"); 
} 
if (str == string.Empty) 
{ 
    throw new ArgumentException("The string cannot be empty.", "str"); 
} 
関連する問題