继承自Array类

4

在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 !

Please Help Thank You.


有很多原因...例如,您不能继承一个数组,那么这里的“隐式”是什么意思? - Dykam
这是一种“成功之坑”的特性,我认为。一个数组并不知道如何对自己进行排序。 - Hans Passant
4个回答

12

这是因为 Sort 方法是 Array 类的静态方法,所以您需要像这样调用它:

Array.Sort(yourArray);

你不需要创建一个类的实例就能调用静态方法。可以直接使用类名来调用。在面向对象编程中,静态方法没有继承的概念。


谢谢回复。所以静态方法不会被继承。有什么特别的原因吗?此外,静态数据成员可以被继承吗? - Joe
4
并不是说这些方法没有被继承,而是你不会在实例上调用它们。在这种情况下,你碰巧向方法提供了一个实例,但这只是巧合。 - Jon Skeet

2

SortArray类的一个静态方法,所以你需要使用Array.Sort()来调用它。如果你尝试使用arr.Sort(),你将会访问一个不存在的实例方法。


2
你可以使用扩展方法将“排序”函数添加为数组类型的实例成员。
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();

免责声明:我没有编译和尝试过这个程序,但我相信它会起作用。


我不明白为什么他们在引入扩展方法时没有先修改Array.Sort签名。使用静态版本的旧代码仍然可以编译,因为它是语法糖,由编译器处理,现有的二进制文件不应受到影响。(尽管这意味着需要添加一个ArrayExtensions类或放宽扩展的“非泛型、非嵌套、静态类”约束条件) - mbx

1

Array.Sort() 是一个静态方法,因此您不会在实例上看到它。但是,您可以在任何 IEnumerable 上使用 OrderBy() 扩展方法来执行您所需的操作。


3
OrderBy 不会在数组内部排序,它会创建一个单独的(但已排序)序列。这并不是同一件事情。 - Marc Gravell
@Marc - 你说得完全正确。我只是在给他解释静态方法方面后,想为他提供另一种达成目标的选择。谢谢。 - Steve Michelotti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接