2014-04-13 106 views
0

我知道IEnumerable是一個接口,我也知道當一個類實現一個接口時,它必須爲該接口中的方法實現特定的主體。我最近一直在編寫一個程序,我覺得我需要將Ienumerable實現到我的一個類中,以便在foreach循環中使用它。之後,我這樣做這是做這樣:實現IEnumberable接口

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類可以使用完全一樣,就好像它在繼承所有枚舉的方法,如選擇(列表),全部(),任何()等。

我想知道如果這些方法的行爲沒有在界面中定義,究竟發生了什麼?

回答

7

所有這些方法都是extension方法,用於實現IEnumerable接口的類型。因此,一旦類型實現IEnumerable也具有這些方法 - 除了方法之外,這些方法已經在類型的主體內定義了。

有關更多文檔,請查看here。另外,如果您還沒有聽說過extension方法,請先看看here

+0

這裏沒有擴展方法。 –

+0

@JonHanna你的意思是? – Christos

+0

我的意思是,你的回答是關於擴展方法,以及指向擴展方法描述的鏈接,但它們與這個問題無關。 –

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方法,只要該擴展方法的命名空間包含在內。您也可以製作自己的擴展方法。