3

を受け取るメソッドがありますがstring、それを操作する前に、それを に変換する必要がありintます。場合によってはnull、その値を に変更する必要があります"0"。今日私は持っています:

public void doSomeWork(string value)
{
   int SomeValue = int.Parse(value ?? "0"); //it can throw an exception(i know)
}

私はやりましたが、上司から次のようにリファクタリングするように言われました。

public void doSomeWork(string value)
{
    if(string.IsNullOrEmpty(value))
        value = "0";
    int SomeValue = int.Parse(value);
}

あなたの意見では、最良の選択肢は何ですか?

4

13 に答える 13

11

なぜ使用しないのTryParse()ですか?

public int doSomeWork(string stringValue)
{
    int value;
    int.TryParse(stringValue, out value);

    return value;
}

上記のコードは0、値が実際の数値以外の場合に戻ります。

したがって、私の意見では、私の例が最も読みやすいです。int を解析して返そうとします。合体演算子も文字列メソッドも使用されません。このメソッドは、解析時にスローされる可能性のある例外も処理します (例外が必要な場合を除きます...)。

于 2009-08-24T19:56:07.137 に答える
5

個人的には、あなたの上司の修正バージョンを探します-おそらくさらにチェックします-文字列が空の場合、あなたが言うように、「」は適切にフォーマットされた数値ではなく、?? null のみをチェックします。

何かのようなもの:

public int doSomeWork(string value) {
  int someValue = 0;

  if (!string.IsNullOrEmpty(value)) {
    Int.TryParse(value, out someValue);
  }
}

これにより、値が「42」に等しい問題が解決されます。

于 2009-08-24T19:50:15.697 に答える
3

あなたの最善の選択肢は上司の言うことに従うことだと思いますが、これはその価値がありません! そうは言っても、あなたの周りにいくつかのスペースを追加してください.

int someValue = int.Parse(value ?? "0");
于 2009-08-24T19:44:59.750 に答える
2

整数値 0 を取得するためだけに文字列 "0" を解析するのはなぜですか? 私は間違いなくこれを好みます:

public int doSomeWork(string value) {
   int someValue;
   if (String.IsNullOrEmpty(value)) {
      someValue = 0;
   } else {
      someValue = Int32.Parse(value);
   }
}
于 2009-08-24T19:52:57.470 に答える
2

私のリファクタリングは次のようになります

public int doSomeWork(string value)
{
   int result = 0; //default?

   if(string.IsNullOrEmpty(value))
   {
      result = 0;
   }
   else
   {
      result = int.Parse(value); //you could also consider using TryParse(...) if your string could possibly also be different from a number.
   }

   //do some calculations upon "result"


   return result;
}

私は現在、リファクタリングに関する Martin Fowlers の本を読んでいます (以前からずっと読みたかったのです)。

于 2009-08-24T19:53:34.227 に答える
2

私は間違いなく、一連の if ステートメントよりも null 合体演算子 (??) を好みます。特に、複数の値を結合する必要がある場合は、演算子のアプローチの方がはるかに読みやすいです。これは、ラムダ式、LINQ シュガー構文など、C# の他の新しい機能に影響を与えます。実際の意図的なコードを混乱させるコードが少ないほど、意図が明確になります。

于 2009-08-24T19:46:05.520 に答える
1

実際には、次のようにリファクタリングできます

変数値 = 0;
int.TryParse(yourString, out value);

いずれにせよ、常に有効な整数があります(それが目標である場合)

于 2009-08-24T19:55:35.220 に答える
1

2 つのオプションは同等ではありません。2 番目のスニペットのバグの一部 ( と読む必要があります。オペレーターは null のみを処理if(string.IsNullOrEmpty(value))するのに対し、null と空の文字列の 2 つのケースを処理します。??

その一部は、より読みやすくなっています。私はあなたの上司の側にいます。

于 2009-08-24T19:47:34.033 に答える
1

別の解決策は

int someValue = string.IsNullOrEmpty(値) ? 0 : int.Parse(値);

于 2009-08-24T19:48:12.007 に答える
1

最初のスニペットは のみをチェックvalue == nullしますが、秒のスニペットは をチェックしますvalue == string.Empty || value == null。メソッドの要件が何であるかはわかりませんが、これらの 2 つのスニペットは異なることを行います。

于 2009-08-24T19:50:39.427 に答える
0

[他の人が指摘しているように、空の文字列ではなくnullをチェックするだけでよいと仮定すると]

2 つの意味上の違いは、それ??が式であるのに対し、whileifはステートメントです。式は、「計算を実行して結果を返す」と言っており、まさにあなたが求めているセマンティクスです。ifステートメントが同じセマンティクスを表現できるようにするには、さらに作業を行う必要があります。それを超えると、if計算よりも多くのロジックの余地が残ります。必要のない余地です。

??目的の意図を正確に表現するため、演算子を使用する必要があります。

于 2009-08-24T19:59:03.683 に答える
0

この場合、前の方が簡単な例なので読みやすいです。**ただし、あなたの場合、 ?? として同等ではありません string.IsNullOrEmpty と同じではありません **

if が複雑な場合は、後者の方が適しています。コース用の馬だと思います。聴衆に依存するだけです。シンプルにしてみてください。

public int doSomeWork(string value)
{
  return int.Parse(value ?? "0");
}



public int doSomeWork(string value)
{
   if(value == null)
      value = "0";
    int SomeValue = int.Parse(value);
    return SomeValue;
}
于 2009-08-24T19:45:59.437 に答える
0

あなたはそれをあなたの方法で行うことができますか?涼しい!

誰もが私よりも C# に慣れていない限り、間違いなく読みやすいです。

于 2009-08-24T19:47:09.293 に答える