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

时间:2013-05-23 12:01:21

标签: c# .net arrays static system.array

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

我发现了这个问题: When is it best to use Static Functions in ASP.NET

但它不能让我满意: - /

1 个答案:

答案 0 :(得分:1)

您继承System.Array的最多时间是使用单维数组。像:

int[] a1 = new int[2];

当您定义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);

最后一个抛出一个带有消息"Only single dimension arrays are supported here."

的RankException

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

...

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

有,并且原则很简单。实例方法表示对象的操作或行为。静态方法是系统的一个函数,它与类的逻辑相关,或者在某些情况下是一个你想要调用的方法而不创建类的实例。

System.Math课程中思考,如果您每次想要调用SqrtPow等方法时需要实例数学,那将会是多么糟糕?

我将给你的最后一个例子是System.Text.RegularExpressions.Regex类。这个类有一个Match方法实现为实例,一个重载实现为静态。

每个都用于不同的背景。多次使用相同模式时使用该实例。在模式中使用模式时的静态代码。