0

次の場合のコンパイラの効率に興味があります。

double total = list.Sum(x => x.Value) ?? 0;

Q:コンパイラはSum関数を1回または2回実行するコードを生成しますか?

次のようなものが生成される可能性があります。

double total = list.Sum(x => x.Value) == null ? 0 : (double)list.Sum(x => x.Value);

また

double temp = list.Sum(x => x.Value);
total = temp == null ? 0 : (double)temp;
4

3 に答える 3

8

すべてのnullを合計しても0になるため、コードは無意味です。

var d = new int?[]{null,null};
d.Sum().Dump(); //0

...だから、あなたが守ろうとしてEnumerable.Sum()いる価値を決して生み出さないでしょう。null

于 2013-03-18T11:35:12.480 に答える
4

コードはSum1回実行されます。これが、言語に新しい演算子を導入することの要点です。これを確認するには、副作用のある状態を導入し、副作用が1回だけ適用されることを確認します。

int? x = 5;
int y = x++ ?? 100;

このコードを実行した後、x6、ではなく、7です。

于 2013-03-18T11:34:33.820 に答える
0

The ?? operator is only applicable to the nullable types, and double is not a nullable type, so this code won't compile. Same, the .Sum() extension method will never return null on this list, it will always return 0.

于 2013-03-18T11:37:11.683 に答える