私の同僚と私は今日Linqについての議論をしていました。特に、System.Linq名前空間は、クエリの補完を使用する前に(usingを使用して)組み込む必要があります。私はこれが非Linq拡張メソッドを誤って使用する可能性を低くするために行われていると考えていましたが、決して結論には至りませんでした。なぜクエリ内包表記を使用するときにSystem.Linq名前空間を含めるべきであり/しないべきなのですか?LINQクエリの解説 - なぜSystem.Linq名前空間が必要ですか?
答えて
フレームワークによって提供される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
}
}
それがコードをコンパイルする前に、コンパイラは、単に「流体」構文にクエリの理解の構文を変換。適切な使用方法が見つかると、通常どおりに処理が進められます。 using
System.Linq
によって、コンパイラはLINQを使用するクエリをサポートするクラスとインターフェイスを見つけ出します。
+1 - サンプルは私の半分よりも短いです。 –
ありがとうございました - 私はこのようなことを書こうとしましたが、私のメソッドシグネチャが正しくないと思います。 –
Linqライブラリはまさにそのライブラリなので、ライブラリです。あなたがそれを必要としない場合は、それをメモリ空間に含めたり、DLLを参照したりしないでください。
linq機能は基本的にIEnumerable<T>
に対して実行されますが、クエリ構文を使用する場合は、C#コンパイラのほんの少しの砂糖を使っているだけです。
参照を含めることは問題ではありません。 System.Linqの内容はアセンブリSystem.Coreにあります。これは 'using 'を介して名前空間を含めることの問題です。 – recursive
はい、そうです。 System.Linq名前空間には、IEnumerable
いいえ、クエリの補完が機能するには、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);
}
}
}
}
- 1. 必要なオブジェクト:名前空間
- 2. ASP.NETのSystem.Linq名前空間でCS0234エラーが発生しました
- 3. 名前空間の前にイニシャライザが必要です
- 4. 基本パッケージの名前空間が必要ですか?
- 5. 名前空間マネージャーまたはXsltContextが必要です
- 6. vuexモジュールには名前空間が必要ですか?
- 7. System.Linq名前空間を含めずにLinqとlambdaを使用することはできますか?
- 8. クラスメソッドがヘッダーファイルのスタンドアロンメソッドを名前空間で修飾する必要があるのはなぜですか?
- 9. Pythonの名前空間の説明
- 10. 名前空間 'Linq'が名前空間 'System.Data'に存在しません
- 11. HandlerThreadに名前が必要なのはなぜですか?
- 12. Nokogiri/Xpath名前空間クエリ
- 13. 空の名前空間のXPathクエリxmlns = ""
- 14. なぜMVA名前空間内のCompareAttributeは、DataAnnotations名前空間ではないのですか?
- 15. はなぜデフォルトの名前空間
- 16. Djangoテンプレートの奇妙な名前空間 - なぜですか?
- 17. System.Collectionsは「システム名前空間の名前空間」ですか?
- 18. なぜC++で名前空間を使用する必要がありますか?
- 19. XML名前空間のHTTPアドレスはなぜですか?
- 20. EFコアマイグレーションにはなぜ名前が必要ですか?
- 21. clojureがバッククォート内の名前に名前空間修飾子を追加するのはなぜですか?
- 22. 名前空間なしのGroovy XMLSlurper名前空間エラー
- 23. POE-Tkの名前空間の理解
- 24. Microsoft.Win64名前空間が存在しないのはなぜですか?
- 25. jqueryがグローバル名前空間を汚染しないのはなぜですか?
- 26. Objective-Cに名前空間がないのはなぜですか?
- 27. なぜLaravel移行クラスに名前空間がないのですか?
- 28. SelectSingleNode名前空間なし
- 29. linqの名前空間で要素の値を設定する方法は?
- 30. Socket.IOが異なる名前空間でクエリパラメータを混ぜる
申し訳ありませんが、これは実際の質問ではありません。この推論の論理的な結論は、「使用する」ステートメントをこれまでに書く必要はないということです。コンパイラはそれをすべて把握する必要があります。 – Yuck
@Yuck - もしそうなら、これはもっと良い世界になるだろう(私はSOが解決すべき多くの問題を持っているだろうと知っている)。 –
@ M.Babcock:いいえ、名前空間の衝突、インテリジェンスの汚染などに遭遇します。これに最も近いのは、ReSharper/CodeRush /などのツールを持つことです。あいまいさがなければ自動的にusingステートメントを置きます。 –