gpt4 book ai didi

c# - 为什么 List.Sort() 是实例方法而 Array.Sort() 是静态的?

转载 作者:行者123 更新时间:2023-11-30 18:14:12 25 4
gpt4 key购买 nike

我试图理解这部分语言背后的设计决策。我承认我对这一切都很陌生,但这最初让我感到困惑,我想知道我是否遗漏了一个明显的原因。考虑以下代码:

List<int> MyList = new List<int>() { 5, 4, 3, 2, 1 };
int[] MyArray = {5,4,3,2,1};


//Sort the list
MyList.Sort();
//This was an instance method


//Sort the Array
Array.Sort(MyArray);
//This was a static method

为什么它们不以相同的方式实现 - 凭直觉对我来说,如果它们都是实例方法会更有意义?

最佳答案

这个问题很有趣,因为它揭示了 .NET 类型系统的细节。与值类型、字符串和委托(delegate)类型一样,数组类型在 .NET 中得到特殊处理。最值得注意的古怪行为是您从不显式声明数组类型。编译器会在充分帮助抖动的情况下为您处理它。 System.Array 是一种抽象类型,在编写代码的过程中会得到专门的数组类型。通过显式创建 type[] 或使用在其基本实现中具有数组的泛型类。

在大型程序中,拥有数百种数组类型并不罕见。这没关系,但每种类型都涉及开销。它只是类型所需的存储,而不是它的对象。其中最大的一 block 是所谓的“方法表”。简而言之,它是指向该类型的每个实例方法的指针列表。类加载器和抖动一起工作来填充这个表。这通常称为“v 表”,但并不完全匹配,该表包含指向非虚拟和虚拟方法的指针。

您可能会看到这导致的结果,设计者担心有很多类型和大方法表。因此寻找减少开销的方法。

Array.Sort() 是一个明显的目标。

同一问题与泛型无关。泛型的一大优点,众多之一,一个方法表可以处理引用类型的任何类型参数的方法指针。

关于c# - 为什么 List.Sort() 是实例方法而 Array.Sort() 是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50781115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com