2016-04-14 4 views
15

与えられたコードは空ではありません。契約は</p> <pre><code>static public int Q() { return Enumerable.Range(0, 100) .Select(i => i) .First(); } </code></pre> <p>は、次の警告を発し

しかし、正確に私が.Ensureに必要なものは、cccheckが満足するように私には分かりません。

+0

、なぜあなたはSelectメソッドを使用している新しいフォーム – Viru

+1

@Viruにソースを変換したいとき...この方法は、それが問題を実証するために特別に作られた最小の実行可能な例を示します使用されています。実際のコードでは、より多くのLINQメソッドが確実にチェーンされています。 – zerkms

+1

@Szeki https://github.com/Microsoft/CodeContracts – zerkms

答えて

1

このコードでの警告を回避できますか?このコードで

var res = Enumerable.Range(0, 100).Select(i => i).Take(1); //execute one query with TOP1 and store in memory 
Contract.Assume(res.Any()); //or res.Count() > 0 //query already in memory 
return res.First(); //query already in memory 
+0

これは間違いなく私の答えの改善です( '.Any()'を使うのが望ましくないかもしれません)。 – zerkms

1

これが問題を解決し、1が最初に思ったかもしれないとまだその醜いではないので、私の答え(1がより良いアイデアを持っている場合、私はしかし、あなたの提案を開いている)としてそれを掲示しています:

static public int Q() 
{ 
    var e = Enumerable.Range(0, 100) 
     .Select(i => i); 

    Contract.Assume(e.Any()); 
    return e.First(); 
} 

スタティックアナライザーが恐れていた部分は、全体を分割する必要はありませんでした。その部分については、「すべてうまく、信頼しています、私がやっていることを知っています」 。

注:何らかの理由で

どちら

Contract.Assert(e.Count() > 0); 

または

Contract.Assert(e.Any()); 

作品。

重要:他の人が言及して追加のe.Any()呼び出しは(いくつかのケースでは望ましくないことがあるコレクションを、マテリアライズであろうから、これは、すべての場合に適していないかもしれません例えば:それはサードパーティからLINQのだときソース)。

+1

良いフォームのために' Contract.Assume(e.Any()); 'を使うべきでしょう。 –

+0

@Wicher Visserが問題のコメントで言ったように。 'Select'と' First'は分割されます。エンティティフレームワーク。生成されたSQLクエリにTOP1は含まれず、パフォーマンスが低下します。 – jlvaquero

+0

@ jlvaqueroそれは? – zerkms

関連する問題

 関連する問題