我的一位同事和我今天正在讨论Linq。特别是在使用查询理解之前需要包含System.Linq命名空间(通过使用)。我当时认为这样做是为了不太可能错误地使用非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 - 你的示例比我的短一半线:)。 – 2012-03-09 01:49:48
谢谢 - 我试图写这样的东西,但我认为我的方法签名并不完全正确。 – 2012-03-09 23:57:54
因为Linq库就是这样一个库。如果你不需要它,那么不要将它包含在内存空间中,或者引用DLL。
但linq功能基本上是针对IEnumerable<T>
运行的,它们只是方法,当您要使用查询语法时,只需要C#编译器中的少量糖。
不,您不需要包含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. System.Linq的命名空间参照System.Core.Dll
- 2. Microsoft.SqlServer.Management.Smo命名空间 - 我需要安装什么来解决它?
- 3. 为什么有些升压功能不需要命名空间
- 4. 用jQuery解析xml命名空间。需要帮助!
- 5. 命名空间查询
- 6. 解析XML与空命名空间
- 7. 为什么需要JSON解析?
- 8. 为什么这个简单的linq查询需要这么多时间?
- 9. 在C#中,我为MYClass命名空间时,为什么还需要前缀MYClass?
- 10. ASP.NET中System.Linq命名空间的CS0234错误
- 11. XML与命名空间的XML的LINQ解析在C#
- 12. Linq to XML XElement解析未知命名空间
- 13. 为什么在这个Linq-To-Xml查询中首先需要?
- 14. 为什么没有Microsoft.Win64命名空间?
- 15. xml解析需要额外的空间
- 16. Spring.net客户命名空间解析器
- 17. 解析命名空间内的feed
- 18. 用命名空间解析XML(gml)
- 19. python etree.ElementTree用dificult命名空间解析
- 20. Groovy Xml解析命名空间
- 21. 解析器缺少XML命名空间
- 22. 在XDocument中解析命名空间c#
- 23. 为什么这个查询需要这么长时间?
- 24. 为什么我的SELECT查询需要这么长时间?
- 25. 为什么这个EF查询需要这么长时间?
- 26. 为什么这个查询需要这么长时间?
- 27. 需要什么查询集?
- 28. 为什么我需要查询界面?
- 29. 为什么我在序列化时需要指定一个xml命名空间?
- 30. xml.writer - 为什么要使用XHTML命名空间?
对不起,但这不是一个真正的问题。这种推理的逻辑结论是,我们不应该写任何“使用”陈述;编译器应该把它全部弄清楚。 – Yuck 2012-03-09 00:30:25
@Yuck - 也许这将是一个更美好的世界,如果它确实存在(我知道这样会有很多问题需要解决)。 – 2012-03-09 00:32:27
@ M.Babcock:不,因为那时我们遇到了命名空间碰撞,智能污染等问题。最接近你的是有ReSharper/CodeRush /等工具。如果没有任何歧义,自动为您使用使用语句。 – 2012-03-09 00:34:20