13

私は次のようなものを数回見ました...そして私はそれが嫌いです。これは基本的に言語を「だます」ことですか?それとも..常に IsNullOrEmpty が最初に評価されるため、これを「OK」と見なしますか?

(文字列が関数から出たときに NULL であるべきかどうかについて議論することはできますが、それは実際の問題ではありません。)

string someString;
someString = MagicFunction();

if (!string.IsNullOrEmpty(someString) && someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // On a NULL string, it drops to here, because first evaluation of IsNullOrEmpty fails
   // However, the Length function, if used by itself, would throw an exception.
}

編集: この言語の基本を思い出させてくれた皆さんに改めて感謝します。「なぜ」それが機能するかはわかっていましたが、コンセプトの名前を知らなかった/覚えていなかったなんて信じられません。

(誰かがバックグラウンドを必要とする場合に備えて..コードのさまざまな場所で、NULL文字列と.Length> x例外によって生成された例外のトラブルシューティング中にこれに遭遇しました。したがって、上記のコードを見たとき、他のすべてに加えて、私の欲求不満はそこから引き継がれました。)

4

15 に答える 15

106

短絡と呼ばれる言語機能を利用しています。これは言語をだますことではありませんが、実際には、使用するように設計されたとおりの機能を使用しています。

于 2009-05-07T20:52:06.450 に答える
24

「短絡」関係演算子に依存しても大丈夫かどうかを尋ねている場合は、はい、それはまったく問題&&ありません。||

于 2009-05-07T20:51:20.053 に答える
6

nullpointer例外が発生しないことを確認したいだけなので、これに問題はありません。

するのが妥当だと思います。

拡張機能を使用すると、よりクリーンにすることができますが、基本的な概念は引き続き有効です。

于 2009-05-07T20:49:33.507 に答える
5

このコードは完全に有効ですが、null型チェックを回避するためにNull合体演算子を使用するのが好きです。

string someString = MagicFunction() ?? string.Empty;
if (someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // NULL strings will be converted to Length = 0 and will end up here.
}
于 2009-05-07T20:54:55.070 に答える
4

これには何も問題はありません。

if( 条件は左から右に評価されるため、このように積み重ねてもまったく問題ありません。

于 2009-05-07T20:51:08.057 に答える
2

私の意見では、これは有効なコードです(ただし、変数を宣言して次の行に割り当てるのはかなり面倒です)が、文字列の長さが<の条件でもelse-blockを入力できることを理解しておく必要があります。 3.3。

于 2009-05-07T20:52:30.723 に答える
2

これは完全に有効であり、そのように使用しても問題はありません。あなたがその言語の文書化された振る舞いに従っているなら、すべてがうまくいくよりも。C#では、使用している構文は条件付き論理演算子であり、ドキュメント化された動作はMSDNにあります。

私にとっては、同じステートメントで乗算と加算を行うときに括弧を使用しない場合と同じです。これは、乗算操作が最初に実行されることを言語が文書化しているためです。

于 2009-05-07T20:53:12.513 に答える
2

それは私には論理的な短絡の完全に合理的な使用のように見えます-どちらかといえば、それは言語と不正行為です。私は最近、短絡したことのないVB6から来たばかりで、それは本当に私を苛立たせまし

注意すべき問題の1つは、else句でNullを再度テストする必要がある場合があることです。これは、記述されているように、Null文字列と3文字未満の文字列の両方で終了するためです。

于 2009-05-07T20:55:45.020 に答える
0

大丈夫だと思います:)NULL変数にアクセスしないようにしているだけです。実際、私は常に変数に対して操作を行う前にそのようなチェックを行います(また、コレクションのインデックスを作成する場合など)-より安全で、ベストプラクティスです。それだけです。

于 2009-05-07T20:54:01.373 に答える
0

C#はデフォルトで条件を短絡するので、それは理にかなっています。それで、それを有利に使用するのは問題ないと思います。VBでは、開発者がANDALSOの代わりにANDを使用すると、いくつかの問題が発生する可能性があります。

于 2009-05-07T20:56:19.183 に答える
0

以下のようなものと変わらないと思います。

INT* pNumber = GetAddressOfNumber();

if ((pNUmber != NULL) && (*pNumber > 0))
{
  // valid number, do whatever
}
else
{
  // On a null pointer, it drops to here, because (pNumber != NULL) fails
  // However, (*pNumber > 0), if used by itself, would throw and exception when dereferencing NULL
}

言語の機能を利用しているだけです。この種のイディオムは、C がこの方法でブール式を実行し始めてから (または最初に実行した言語で)、一般的に使用されていると思います。

于 2009-05-07T21:00:15.617 に答える
0

アセンブリにコンパイルしたのが c のコードである場合、ショートサーキットは正しい動作であるだけでなく、より高速です。機械語では、if ステートメントの各部分が次々と評価されます。ショートしないほうが遅いです。

于 2009-05-07T21:01:09.720 に答える
0

少し話題から外れますが、vb.net で同じ例を次のように実行した場合

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) and someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

これはnull(何もない)文字列にぶつかりますが、VB.Netでは次のようにコーディングし、C#でも同じことを行います

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) andalso someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

andalso を追加すると、同じように動作し、読みやすくなります。vb と c' の両方の開発を行っている人として、2 番目の vb はログインがわずかに異なることを示しているため、違いがあることなどを誰かに説明するのが簡単です。

ドルックス

于 2009-05-08T08:58:00.773 に答える