LINQ返回一个接口
本文关键字:一个 接口 返回 LINQ | 更新日期: 2023-09-27 18:06:34
只是浏览了一下MSDN上的LINQ教程,遇到了以下代码:
IEnumerable<int> numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
我不明白接口是如何返回的?这是我的理解,接口只是一个类的轮廓,当然不能包含任何数据。
我希望这能被澄清
接口是关于返回值的契约:Linq实际上不会告诉你它将返回什么(就像在实际的类中一样),但它会保证它的行为像IEnumerable<int>
,也就是说,它返回的类实现了这个接口。它可以是List<int>
或WhackyLinqInternalEnumerable<int>
-但你并不真正关心,因为,你感兴趣的是接口(你可以用这个对象做什么)。
变量和它所代表的对象之间的区别可能会使您感到困惑:对于(引用)类型,变量只是"指向"对象。你可以有很多变量"指向"同一个对象。它们不需要具有相同的类型,但它们都指向的对象必须与变量具有相同的类型,或者是子类型,或者(在具有接口类型的变量的情况下)必须实现相同的变量。
你得到了一个接口的实现,但是通过接口来处理它——你不知道具体的Type。
http://en.wikipedia.org/wiki/Interface_(计算)
但是你可以创建interface类型的对象…不要混淆类类型和接口类型
下面是如何创建接口类型的例子:同样的事情发生在上面的interface IA
{
void methodA();
}
Class B : IA
{
}
Class C
{
IA a = new B();
}
public interface IMyInterface {
}
public class MyCoolInterfaceImplementation : IMyInterface {
}
//somewhere in code
IMyInterface inter = new MyCoolInterfaceImplementation ();
这是完全有效的代码。您提供的代码中也有相同的思想。
它的意思是linq查询返回满足这个接口的类的实例。作为调用者,您不需要知道实际的类是什么,只需知道它满足指定的接口即可。
如果一个方法返回一个接口,当然它必须返回一个实际的对象,一个实现了特定接口的类。
这通常被认为是方法与调用者之间的"契约"。这个方法说"我将总是返回具有这种特定行为的东西"。
在这种特殊情况下,LINQ查询代码必须返回实现IEnumerable<int>
接口的任何对象。
换句话说,如果你这样做:
Debug.WriteLine(numQuery1.GetType().FullName);
你会看到实际的类型被返回。
下面的例子:
var numbers = new[] { 1, 2, 3, 4 };
IEnumerable<int> numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
Debug.WriteLine(numQuery1.GetType().FullName);
将在。net 4.0中输出:
System.Linq.OrderedEnumerable 2[[系统。Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System. int]Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
表示这是System.Linq.OrderedEnumerable<int, int>
。
然而,这是真正的重点,你不应该太在意。您只需要知道LINQ查询返回实现该接口的。在未来的。net版本中,代码实际上可能返回其他东西,但仍然是实现IEnumerable<T>
的对象。
想象一下:现在是5点,你想回家。在这一点上,您将如何到达那里真的无关紧要:(抽象地说)您可以实例化类Car或类Bike甚至类Tank。但说实话,你在乎吗?只要取一个实现IVehicle的实例,然后返回