Почему методы Array не встроены в экземпляр Array?
Вопрос
Извините за, возможно, глупый вопрос, но он не дает мне покоя...
int[] i = {3, 2, 1};
//why
Array.Sort(i);
//instead of
i.Sort();
char c = 'c';
//why
char.IsLetter(c);
//instead of
c.Isletter();
Решение
Спасибо Педро д'Аквино за определение этих других вопросов, которые дают ответы.
Основной момент заключается в том, что методы экземпляра в структурах не являются потокобезопасными, в отличие от статических методов.
Посмотрите на эти вопросы:
Другие советы
Это служебные методы, которым не обязательно принадлежать к этим классам. Это усиливает Принцип единой ответственности
(правка) Я путал с Java
( О статических членах ): р>
Статические члены класса могут использоваться для отдельные данные и поведение, которое независимо от идентичности объекта: данные и функции не меняются независимо от того, что происходит с объект. Статические классы могут быть использованы когда нет данных или поведения в класс, который зависит от объекта идентичность. р>
поточно-ориентированная точка зрения это тоже веская причина.
Вы можете сделать это сами, если используете .NET 3.0, используя методы расширения:
public static class Extensions
{
public static bool IsLetter(this chr)
{
return char.IsLetter(chr);
}
}
затем назовите его так: c.IsLetter ()
Или делай так, как хочешь. То же самое при сортировке
Это решение о реализации. Я не знаю, что все происходило в голове дизайнера фреймворка, но я считаю, что одной из причин является возможность сортировки массива пользовательских типов с наименьшими усилиями. Р>
Любой класс, который реализует iComparable, может быть помещен в массив и отсортирован. Если бы это был метод массива, то мне пришлось бы написать новый тип Array для моего пользовательского типа.
Кроме того, как уже отмечалось, примитивные типы требуют такой конструкции массива.