2010-11-19 69 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