2010-11-19 11 views
4

Vererbung von Array Klasse

Alle Arrays, die ich in C# erstelle, erben implizit von der Array-Klasse. Warum sind also Methoden wie Sort() usw. für das Array, das ich erstelle, nicht verfügbar? Betrachten wir zum Beispiel den folgenden Code:

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 ! 

Bitte Hilfe danken Ihnen.

+0

Es gibt viele Gründe ... du kannst zum Beispiel kein Array erben, was meinst du mit 'implizit' hier? – Dykam

+0

Fall in die Grube des Erfolgs ein bisschen Feature, denke ich. Ein Array kann * nicht * sich selbst sortieren. –

Antwort

12

Es ist, weil die Sort Methode eine statische Methode auf die Array-Klasse definiert ist, so dass Sie es so nennen müssen:

Array.Sort(yourArray); 

Sie keine Instanz der Klasse eine statische Methode aufrufen. Sie rufen es direkt über den Klassennamen auf. In OOP gibt es keine Vorstellung von Vererbung für statische Methoden.

+0

Danke für die Antwort. So werden statische Methoden nicht vererbt. Irgendein bestimmter Grund dafür?. Können statische Datenmitglieder auch vererbt werden? – Joe

+4

@Joe: Es ist nicht so sehr, dass sie nicht vererbt werden, da man sie nicht "an" einer Instanz nennt. In diesem Fall liefern Sie zufällig eine Instanz an die Methode, aber das ist tatsächlich ein Zufall. –

+0

Oh, ich verstehe es jetzt! :) .. Danke :) – Joe

2

Sort ist eine statische Methode auf der Array Klasse, deshalb nennen Sie es Array.Sort(). Wenn Sie arr.Sort() versuchen, versuchen Sie, auf eine Instanzmethode zuzugreifen, die nicht existiert.

1

Array.Sort() ist eine statische Methode, so dass Sie es nicht hängen von Instanzen sehen. Sie können jedoch die Erweiterungsmethode OrderBy() auf jedem IEnumerable verwenden, um das zu tun, was Sie suchen.

+3

OrderBy sortiert ein Array nicht intern; es erstellt eine separate (aber sortierte) Sequenz. Das ist nicht dasselbe. –

+0

@Marc - Sie sind absolut richtig. Ich habe nur versucht, ihm eine Alternative zu geben, um sein Ziel zu erreichen, nachdem ich den Aspekt der statischen Methode erklärt habe. Vielen Dank. –

2

Sie könnten wahrscheinlich eine Erweiterungsmethode verwenden, um eine Sortierfunktion als Instanzelement des Array-Typs hinzuzufügen.

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

Beispiel

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

HAFTUNGSAUSSCHLUSS: Ich habe nicht erstellt und versucht, aber ich bin mir ziemlich sicher, dass es funktionieren wird.

+0

Ich frage mich, warum sie ihre Array.Sort-Signatur nicht an erster Stelle geändert haben, als sie ExtensionMethods einführten. Alter Code, der die statische Version verwendet, würde immer noch kompilieren und da es syntaktischer Zucker ist, den der Compiler behandelt, sollten vorhandene Binärdateien nicht betroffen sein. (Dies würde jedoch bedeuten, dass eine ArrayExtensions-Klasse hinzugefügt oder die Einschränkung "nicht generische, nicht verschachtelte, statische Klasse" für Extensions gelockert wird). – mbx