我知道IEnumerable是一个接口,我也知道当一个类实现一个接口时,它必须为该接口中的方法实现特定的主体。我最近一直在编写一个程序,我觉得我需要将Ienumerable实现到我的一个类中,以便允许它在foreach循环中使用。我这样做之后就这样做了:
class FData: IEnumerable<EClass> {
// Removed the irrelevant contents
public IEnumerator<EnumerableClass> GetEnumerator()
{
for (int i = 0; i < Emp_Id.Count; i++) {
yield return (new EnumerableClass { Emp_Id = Emp_Id[i], Salary = Salary[i] });
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
我看到我的FData类可以像List一样使用,就好像它继承了所有可枚举的方法,如Select(),All(),Any()等。
我想知道如果界面中没有定义这些方法的行为,究竟会发生什么?
答案 0 :(得分:7)
对于实现extension
接口的类型,所有这些方法都是IEnumerable
方法。因此,一旦类型实现IEnumerable
具有方法,这些方法 - 除了方法之外,已经在类型的主体内定义了。
答案 1 :(得分:2)
它们是扩展方法,而且还有更多信息。
扩展方法在某些命名空间内的静态类中作为静态方法存在,并且该方法的第一个参数包含this
关键字(请参阅OfType
下面的示例方法签名)。在这种情况下,您可能会看到System.Linq.Enumerable extension methods。如果要从类文件中删除using System.Linq
命名空间,则这些扩展方法将不再可用。在像Resharper这样的市场重构工具之后会建议适当的扩展方法,但是你在Visual Studio中开箱即用的方法不会建议扩展方法(例如Ctrl +。)。因此,如果您需要它们,则必须确保在类文件的顶部添加适当的using
语句。如果您不想要它们并且不需要命名空间中的任何其他类,则可以将其删除,并且扩展方法将不再可用。
public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source);
这样做的好处是,只要包含该扩展方法的名称空间,任何实现IEnumerable
的方法都将具有OfType
方法。您也可以制作自己的扩展方法。