2010-11-19 141 views
4

繼承Array類

我在C#中創建的所有數組都隱式地從Array類繼承。那麼爲什麼像Sort()等方法不適用於我創建的數組。 例如,請考慮下面的代碼:

int [] arr = new int[]{1,2,3,4,5}; 

Console.WriteLine(arr.Length); //This works,Length property inherited from Array 

Array.Sort(arr); //Works 

arr.Sort(); //Incorrect ! 

請幫助 謝謝。

+0

有很多原因......你不能繼承一個數組,例如,你在這裏的含義是什麼? – Dykam 2010-11-19 13:44:25

+0

我認爲,落在成功的坑裏有點特徵。一個數組不知道如何自我排序。 – 2010-11-19 15:33:34

回答

12

這是因爲Sort方法是Array類定義的,所以你需要調用它的靜態方法:

Array.Sort(yourArray); 

你不需要的類的實例調用靜態方法。你直接用類名稱來調用它。在OOP中,靜態方法沒有繼承的概念。

+0

感謝您的回覆。所以靜態方法不會被繼承。任何特定的原因呢?。還有,靜態數據成員可以被繼承嗎? – Joe 2010-11-19 13:40:13

+4

@Joe:沒有太多,他們沒有被繼承,因爲你不會將它們稱爲「在實例上」。在這種情況下,你碰巧爲該方法提供了一個實例,但這實際上是巧合。 – 2010-11-19 13:41:08

+0

哦,我明白了! :) ..謝謝:) – Joe 2010-11-19 13:42:07

2

SortArray類中的靜態方法,這就是爲什麼使用Array.Sort()來調用它的原因。當您嘗試arr.Sort()時,您試圖訪問不存在的實例方法。

1

Array.Sort()是一種靜態方法,因此您不會看到它掛起實例。但是,您可以在任何IEnumerable上使用OrderBy()擴展方法來執行您正在尋找的操作。

+3

OrderBy不會在內部排序數組;它創建一個單獨的(但排序)序列。這不是一回事。 – 2010-11-19 13:43:19

+0

@Marc - 你絕對正確。在我解釋了靜態方法方面之後,我只是想給他一個替代方案來實現他的目標。謝謝。 – 2010-11-19 13:47:08

2

您可能可以使用擴展方法將Sort函數添加爲Array類型的實例成員。

public static class ArrayExtension 
{ 
    public static void Sort(this Array array) 
    { 
     Array.Sort(array); 
    } 
} 

int [] arr = new int[]{1,2,3,4,5}; 
arr.Sort(); 

免責聲明:我沒有編譯和嘗試這樣做,但我敢肯定它會成功。

+0

我想知道他們爲什麼在引入ExtensionMethods的時候還沒有修改他們的Array.Sort簽名。使用靜態版本的舊代碼仍然可以編譯,因爲它是編譯器處理的語法糖,所以現有的二進制文件不應受到影響。 (儘管這意味着添加一個ArrayExtensions類或放寬擴展的「非泛型,非嵌套,靜態類」約束) – mbx 2013-09-24 07:14:40