我的一位同事和我今天正在就Linq进行讨论。特别是,在可以使用查询推导之前,需要包含System.Linq命名空间(通过usings)。我认为这样做是为了不太可能错误地使用非Linq扩展方法,但我们从未得出结论。使用查询推导时,为什么应该/不应该包含System.Linq命名空间?
答案 0 :(得分:3)
这听起来很明显,但是当我们打算使用Framework提供的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 :(得分: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);
}
}
}
}
答案 2 :(得分:0)
因为Linq库就是一个库。如果您不需要它,则不要将其包含在内存空间中,或引用DLL。
但是linq功能基本上是针对IEnumerable<T>
运行的,它们只是方法,当您想要使用查询语法时,C#编译器会有一点点糖。