为什么System.Array的大多数方法都是静态的?

nee*_*ing 17 .net c# arrays static system.array

我想这更像是一个框架设计问题.我最近想知道为什么System.Array中的大多数方法都是静态的.我的直觉反应总是在Array实例上使用例如IndexOf(object),而不是System.Array.IndexOf(array,object).决定背后是否有一个主要原则,是否使方法静止?

我发现了这个问题: 什么时候最好在ASP.NET中使用静态函数

但它并不能让我满意: - /

Jon*_*zzi 1

您继承的最多时间System.Array是使用一维数组。喜欢:

int[] a1 = new int[2];
Run Code Online (Sandbox Code Playgroud)

当你定义int[]这个隐式派生自System.Array类型时,就像 @Sergey Rybalkin 所说的那样。在这种情况下,该方法IndexOf肯定最好实现为实例方法而不是静态方法。

但还有另一种类型继承自 System.Array,例如多维数组。在这种情况下(多维)该方法IndexOf没有意义。

测试一下:

int[,] arr = new int[2, 2];

arr[0, 0] = 3; arr[1, 0] = 4;
arr[0, 1] = 5; arr[1, 1] = 6;

Array.IndexOf(arr, 4);
Run Code Online (Sandbox Code Playgroud)

最后一个 like 抛出 RankException 并显示消息"Only single dimension arrays are supported here."

也许,而且最有可能的是,因为这个方法是静态实现的。

...

关于评论Is there a main principle behind the decision, whether to make a method static or not?

是有的,而且原理很简单。实例方法代表对象的动作或行为。静态方法是与类逻辑相关的系统功能,或者在某些情况下是您希望在不创建类实例的情况下调用的方法。

想想在System.Math课堂上如果每次你想调用像Sqrtor 这样的方法时都需要实例数学,那会是多么混乱Pow

我给你的最后一个例子是课程System.Text.RegularExpressions.Regex。该类有一个Match作为实例实现的方法和一个作为静态实现的重载。

每一个都在不同的上下文中使用。当您多次使用相同的模式时,将使用该实例。当您在代码中使用该模式的唯一时间时的静态。

  • “如果答案有启发性,请标记...”?:-P 不不..标记为正确答案*如果这是正确答案*。 (4认同)
  • 我认为你的额外例子不太合适。制作“System.Math”的“Sqrt”或“Pow”等函数的实例方法是没有意义的,因为这些函数*不需要“System.Math”实例*。另一方面,使它们成为各种数字类型(例如“double”等)的实例方法是可以想象的。至于正则表达式,在我看来,静态方法对于独特的调用并没有“表现更好”;它只是有助于缩短代码。 (2认同)