我发现在 Array.Sort 中,
[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail), SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool TrySZSort(Array keys, Array items, int left, int right);
被调用。 知道这是如何实现的吗?
最佳答案
您可以从 SSCLI20 source distribution 获得一份相当可靠的 CLR 源代码副本。 .它于 2005 年发布,当时是 CLR 版本 2 的相当准确的副本。从未发现明显的差异。
从那时起,这已经是 7 年前的事了,此后 CLR 版本进行了一次相当重要的更新。但是 TrySZSort() 仍然存在,那些低级实现是高度 self 保护的。您会发现它在 clr/src/vm/ecall.cpp 中声明并映射到 ArrayHelper::TrySZSort(),这是一个在 clr/src/vm/arrayhelpers.cpp 中声明的 C++ 方法
否则非常无聊,它只是调用一个名为ArrayHelpers<T>.QuickSort()
的模板类方法。 , 按值类型元素的数组元素类型专门化。
这正是 Tony Hoare 在 52 年前写下它的方式。尽管不是在 C++ 中;)
您会在 this answer 中找到此代码用 C++ 而不是 C# 编写的原因.
关于.NET 4.0 内部实现排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11944324/