因为array.sort是system.array类的静态方法,而int[]等数组类型不继承其全部实例成员,故只能通过array.sort(arr)调用,不能写成arr.sort()。

Array 类的静态方法不是“语法糖”,而是必须显式调用的工具;直接在数组变量上调用 Sort 或 Reverse 会编译失败。
为什么 Array.Sort(arr) 不能写成 arr.Sort()?
因为 Array.Sort、Array.Reverse、Array.IndexOf 等都是 Array 类的静态方法,不是数组实例的方法。数组类型(如 int[])本身没有这些成员。
- 错误写法:
arr.Sort()→ 编译器报错:'int[]' does not contain a definition for 'Sort' - 正确写法:
Array.Sort(arr),Array.Reverse(arr) - 例外:只有
Length、GetLength()、CopyTo()等少数几个是实例方法,可写成arr.Length或arr.CopyTo(...) - 根本原因:C# 中所有数组都隐式继承自
System.Array抽象基类,但语言层面不暴露其实例方法集合,只开放部分常用实例成员
Array.IndexOf 和 Array.FindIndex 的关键区别
IndexOf 只能做值相等匹配,FindIndex 支持任意条件判断——这是是否需要写循环的关键分水岭。
-
Array.IndexOf(nums, 42):仅当元素 等于 42(使用Equals)时返回索引,找不到返回 -1 -
Array.FindIndex(nums, x => x > 40 && x % 2 == 0):第一个大于 40 且为偶数的元素索引 - 性能差异:两者都是 O(n) 遍历,但
FindIndex多一次委托调用开销;简单值查找优先用IndexOf - 注意空数组:两者对空数组均返回 -1,无需额外判空
Array.Copy 和 CopyTo 容易混淆的参数顺序
这两个复制方法方向相反:一个是“从源到目标”,一个是“从当前数组到目标”——参数顺序一错就覆盖错位置或越界。
-
Array.Copy(source, sourceIndex, destination, destIndex, length):四参数版最常用,source在前 -
destArray.CopyTo(destArray, startIndex):调用者是源,destArray是目标,startIndex指在目标数组中的起始偏移 - 常见错误:
arr.CopyTo(buffer, 0)表示把arr全部拷进buffer[0..];若写成buffer.CopyTo(arr, 0)就反了,会把buffer内容覆写到arr - 类型安全:两个方法都要求源与目标元素类型兼容,否则运行时报
ArrayTypeMismatchException
Array.TrueForAll 和 Array.Exists 的语义陷阱
它们不返回元素,只返回 bool;而且逻辑短路行为和命名高度一致——但新手常误以为 TrueForAll 是“只要有一个为真就返回 true”。
-
Array.TrueForAll(arr, x => x > 0):全部 > 0 才返回true;遇到第一个 ≤ 0 立即返回false -
Array.Exists(arr, x => x == 0):只要有一个 == 0 就返回true;遇到第一个匹配项立即返回 - 空数组情况:
TrueForAll对空数组返回true(全称命题 vacuously true),Exists返回false - 替代写法:如果需要获取满足条件的元素本身,用
Array.Find;需要索引,用Array.FindIndex
真正容易被忽略的是:所有 Array 静态方法操作的都是原数组,没有一个会返回新数组——Reverse、Sort、Clear 全是 in-place 修改。如果原始数据要保留,必须先 Array.Copy 或用 LINQ 的 ToArray()(但那是另一套机制)。











