2012-03-09 9 views
0

私の同僚と私は今日Linqについての議論をしていました。特に、System.Linq名前空間は、クエリの補完を使用する前に(usingを使用して)組み込む必要があります。私はこれが非Linq拡張メソッドを誤って使用する可能性を低くするために行われていると考えていましたが、決して結論には至りませんでした。なぜクエリ内包表記を使用するときにSystem.Linq名前空間を含めるべきであり/しないべきなのですか?LINQクエリの解説 - なぜSystem.Linq名前空間が必要ですか?

+2

申し訳ありませんが、これは実際の質問ではありません。この推論の論理的な結論は、「使用する」ステートメントをこれまでに書く必要はないということです。コンパイラはそれをすべて把握する必要があります。 – Yuck

+0

@Yuck - もしそうなら、これはもっと良い世界になるだろう(私はSOが解決すべき多くの問題を持っているだろうと知っている)。 –

+2

@ M.Babcock:いいえ、名前空間の衝突、インテリジェンスの汚染などに遭遇します。これに最も近いのは、ReSharper/CodeRush /などのツールを持つことです。あいまいさがなければ自動的にusingステートメントを置きます。 –

答えて

3

フレームワークによって提供されるLINQ機能を使用する場合は、これは明らかですが、System.Linq名前空間を含める必要があります。しかし、何も私たち自身のものを使うのを妨げるものはなく、コンパイラは気にしません。

例えば

、以下の(愚かな、しかし完全な!)コードフラグメントコンパイルして完璧に動作します:

// no usings at all 
static class DumbLinq 
{ 
    static int Select(this int i, System.Func<int, int> f) 
    { 
     // actually, our Select is a negation operator in disguise 
     return -i; 
    } 

    static void Main() 
    { 
     int i = 10; 
     var j = from n in i 
       select n; 
     System.Console.WriteLine(j); // prints -10 
    } 
} 

それがコードをコンパイルする前に、コンパイラは、単に「流体」構文にクエリの理解の構文を変換。適切な使用方法が見つかると、通常どおりに処理が進められます。 usingSystem.Linqによって、コンパイラはLINQを使用するクエリをサポートするクラスとインターフェイスを見つけ出します。

+0

+1 - サンプルは私の半分よりも短いです。 –

+0

ありがとうございました - 私はこのようなことを書こうとしましたが、私のメソッドシグネチャが正しくないと思います。 –

0

Linqライブラリはまさにそのライブラリなので、ライブラリです。あなたがそれを必要としない場合は、それをメモリ空間に含めたり、DLLを参照したりしないでください。

linq機能は基本的にIEnumerable<T>に対して実行されますが、クエリ構文を使用する場合は、C#コンパイラのほんの少しの砂糖を使っているだけです。

+0

参照を含めることは問題ではありません。 System.Linqの内容はアセンブリSystem.Coreにあります。これは 'using 'を介して名前空間を含めることの問題です。 – recursive

+0

はい、そうです。 System.Linq名前空間には、IEnumerable に対して動作し、ときどき返すメソッド呼び出しが含まれています。彼らがusingステートメントを追加するのは、変更を破るという問題に対処するためです。レガシーコードで "選択"メソッドを実装して、Linqがデフォルトネームスペースに魔法のように追加された場合、アップグレード後に古いコードが突然破損します。( – Spence

3

いいえ、クエリの補完が機能するには、System.Linqを含める必要はありません(例を参照)。

using System; 
using System.Collections.Generic; 

namespace SelectQuery 
{ 

    internal static class MyExtensions 
    { 
     public static IEnumerable<int> Select(this int[] items, Func<int, int> selector) 
     { 
      return items; 

     } 
    } 

    class Program 
    { 

     static void Main(string[] args) 
     { 
      int[] data = new[] { 1, 2, 34 }; 

      var result = from v in data select v; 
      foreach (var i in result) 
      { 
       Console.WriteLine(i); 
      } 
     } 
    } 
} 
関連する問題