我想这更像是一个框架设计问题。我最近想知道为什么 System.Array 中的大多数方法都是静态的。我的直觉反应总是在 Array 实例上使用 IndexOf(object),而不是 System.Array.IndexOf(array, object)。决定是否有一个主要原则,是否使方法静态?
我发现了这个问题: 什么时候最好在 ASP.NET 中使用静态函数
但这并没有让我满意:-/
我想这更像是一个框架设计问题。我最近想知道为什么 System.Array 中的大多数方法都是静态的。我的直觉反应总是在 Array 实例上使用 IndexOf(object),而不是 System.Array.IndexOf(array, object)。决定是否有一个主要原则,是否使方法静态?
我发现了这个问题: 什么时候最好在 ASP.NET 中使用静态函数
但这并没有让我满意:-/
您继承的最多时间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);
最后一个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
如果每次你想调用类似Sqrt
or的方法时都需要实例数学,那会有多混乱Pow
?
我要给你的最后一个例子是System.Text.RegularExpressions.Regex
类。这个类有一个Match
实现为实例的方法和一个实现为静态的重载。
每一个都在不同的上下文中使用。当您多次使用相同的模式时使用该实例。当您在代码中使用该模式时的静态是唯一的。