10

同じ機能に対して次の2つのアプローチがあります。1つは「if」条件を使用し、もう1つは「??」を使用します。とキャスティング」。どちらのアプローチが良いですか?なぜですか?

コード:

  Int16? reportID2 = null;
  //Other code

  //Approach 1
  if (reportID2 == null)
  {
       command.Parameters.AddWithValue("@report_type_code", DBNull.Value);
  }
  else
  {
     command.Parameters.AddWithValue("@report_type_code", reportID2);
  }

  //Approach 2
  command.Parameters.AddWithValue("@report_type_code", ((object) reportID2) ?? DBNull.Value);

アップデート

回答に基づいて、以下の利点があります ??

  1. 読みやすさの向上
  2. プログラムフローの分岐深度の減少(循環的複雑度の減少)

注:オブジェクトとしてキャストするコストはごくわずかです。

参照

  1. ヌル結合演算子-なぜキャストするのですか?
4

4 に答える 4

10

null合体演算子(??)は、最初のブロックと同じことを実行しますが、1行で読みやすいため、より適切なアプローチです。これにより、コードがより読みやすく、保守しやすくなります。

これは、シンタックスシュガーの多くの例の1つです。つまり、一般的に使用されるアイデアを表すための「ショートカット」であるコードステートメントです。i++を置き換えるので、これの別の例ですi = i + 1。と同じように、よりクリーンでシンプル??です。

于 2012-12-04T08:04:41.107 に答える
4

このような場合、私は常にnull合体演算子を使用します。

command.Parameters.AddWithValue("@name", value ?? DBNull.Value);

command.ExecuteScalar() as int? ?? -1;

コードの可読性が向上し、分岐の深さが減少します。また、特にADO.NETなどのデータベース関連のシナリオ用に作成されました。

于 2012-12-04T08:02:23.647 に答える
2

あなたの例では、アプローチ2の方が優れています。繰り返すべきではありません。apprach1にはコードとパラメーター名が2回あります。パラメータ名を変更したい場合は、2か所で変更する必要があります。これは面倒です。

これを比較する実際のコードは次のとおりです。

object value = DBNull.Value;
if (reportID2 != null)
{
    value = reportID2;
}
command.Parameters.AddWithValue("@report_type_code", value);

これを使用する場合、または??オペレーターは個人的な好みの問題です。if特に、合体演算子の場合は括弧とキャストが必要なため、これはより明確だと思います。

于 2012-12-04T08:06:35.790 に答える
0

??オペレーターの方がいいです。簡潔さは必ずしも読みやすさを向上させるとは限りませんが、この場合は、読者として、との2行で何が等しいか何が異なるかを比較する必要がないためifですelse。さらに、コードの重複を排除しました(これは常に良いことです!)。データベースフィールド名の名前を変更する場合を考えてみます@report_type_code。その後、1か所で変更するだけです。

于 2012-12-04T08:09:11.797 に答える