Почему большинство методов System.Array статические?
Я думаю, это больше вопрос дизайна фреймворка. Недавно я удивился, почему большинство методов в System.Array являются статическими. Моя внутренняя реакция всегда заключается в использовании, например, IndexOf(объект) в экземпляре Array, а не в качестве System.Array.IndexOf(массив, объект). Есть ли основной принцип, лежащий в основе решения, делать метод статичным или нет?
Я нашел этот вопрос: когда лучше всего использовать статические функции в ASP.NET
Но это меня не удовлетворило:-/
1 ответ
Наибольшее время вы наследуете System.Array
использует массив одного измерения. лайк:
int[] a1 = new int[2];
Когда вы определяете int[]
это неявно происходит от System.Array
типа как @ Сергей Рыбалкин говорит. В этом случае метод 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);
Последний лайк создает исключение 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
или же Pow
?
Последний пример, который я дам вам, - это System.Text.RegularExpressions.Regex
учебный класс. Этот класс имеет Match
метод реализован как экземпляр, а перегрузка реализована как статический.
Каждый из них используется в различном контексте. Экземпляр используется, когда вы используете один и тот же шаблон несколько раз. Статическое при использовании шаблона уникальное время в вашем коде.