2010-11-19 4 views
4

следучая страница Array class

Все массивы, которые я создаю на C#, наследуют неявно из класса Array. Итак, почему методы, подобные Sort() и т. Д., Недоступны для массива i create. Например, рассмотрим следующий код:

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

+0

Падение в яме успеха любопытная функция, думаю. Массив не знает, как сортировать себя. –

ответ

12

Это потому, что метод Sort является статическим методом, определенным в классе Array, так что вы должны назвать это так:

Array.Sort(yourArray); 

Вам не нужен экземпляр класса для вызова статического метода. Вы вызываете его непосредственно из имени класса. В ООП нет понятия наследования для статических методов.

+0

Спасибо за ответ. Поэтому статические методы не наследуются. Любая конкретная причина для этого?. Кроме того, могут быть наследованы статические члены данных? – Joe

+4

@Joe: Это не так, что они не унаследованы как то, что вы не называете их «на» экземпляре. В этом случае вы оказываете * поставку * экземпляра методу, но это фактически совпадение. –

+0

О, я понял! :) .. Спасибо :) – Joe

2

Sort является статическим методом на классе Array, поэтому вы называете его Array.Sort(). Когда вы попробуете arr.Sort(), вы пытаетесь получить доступ к методу экземпляра, который не существует.

1

Array.Sort() - это статический метод, поэтому вы не увидите его, зависающего от экземпляров. Однако вы можете использовать метод расширения OrderBy() для любого IEnumerable, чтобы делать то, что вы ищете.

+3

OrderBy не сортирует массив внутри; он создает отдельную (но отсортированную) последовательность. Это не одно и то же. –

+0

@Marc - вы абсолютно правы. Я просто пытался дать ему альтернативу для достижения своей цели после того, как я объяснил аспект статического метода. Благодарю. –

2

Возможно, вы можете использовать метод расширения для добавления функции сортировки в качестве члена экземпляра типа 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

Интересно, почему они не изменили свою подпись Array.Sort в первую очередь, когда они внедряют ExtensionMethods. Старый код, использующий статическую версию, все еще будет компилироваться, и поскольку это синтаксический сахар, который обрабатывает компилятор, существующие бинарные файлы не должны затрагиваться. (Хотя это означало бы добавление класса ArrayExtensions или ослабление ограничения «не общего, не вложенного, статического класса» для расширений) – mbx