Почему большинство методов System.Array статичны? - программирование
Подтвердить что ты не робот

Почему большинство методов System.Array статичны?

Я предполагаю, что это скорее вопрос дизайна рамки. Недавно я задавался вопросом, почему большинство методов в System.Array являются статическими. Моя реакция кишки всегда заключается в использовании, например, IndexOf (объект) в экземпляре массива, а не как System.Array.IndexOf(массив, объект). Есть ли основной принцип решения, нужно ли статизировать метод или нет?

Я нашел этот вопрос: Когда лучше всего использовать статические функции в ASP.NET

Но это меня не удовлетворило: -/

4b9b3361

Ответ 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);

Последний, например, генерирует исключение 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, реализованный как экземпляр, и перегрузка реализована как статическая.

Каждый из них используется в другом контексте. Экземпляр используется, если вы используете один и тот же шаблон несколько раз. Статический, когда вы используете шаблон в вашем коде уникальное время.