Почему функция dot.IsLower () является статическим методом? - PullRequest
6 голосов
/ 23 декабря 2008

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

Это так странно, что на самом деле мне пришлось опубликовать вопрос StackOverflow , чтобы понять, что IsUpper существует (поскольку он не отображался при автозаполнении)

Редактировать

Я понимаю, что мое предыдущее утверждение нуждается в небольшом объяснении. Примером хорошего дизайна является String.ToLower (). Вместо того, чтобы создавать его как статический void ToLower (String foo), он является методом-членом. Совершенно очевидно (по крайней мере для меня), что то же самое должно выполняться для char.IsLower ().

Ответы [ 3 ]

7 голосов
/ 23 декабря 2008

Методы экземпляра для структур не являются поточно-ориентированными . Статические методы с другой стороны являются .

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

Именно поэтому большинство методов в структурах / примитивах являются статическими, а не экземплярами.

Вот тут похожий вопрос.

Почему IsNan является статическим методом в классе Double вместо свойства экземпляра?

3 голосов
/ 23 декабря 2008

См. Также этот вопрос.

Короткая версия - В начальной среде IDE возникли проблемы с созданием intellisense при вызове из строкового литерала (и я предполагаю, что и литералы типа char тоже). Поэтому дизайнеры сделали методы статичными, чтобы обойти эту проблему.

REEDIT: У меня была небольшая шумиха о том, что дизайнеры .NET кланяются давлению дизайнеров IDE. Но, увидев ответ Попа на этот вопрос, я уже не уверен в этом.

EDIT2: Тим в комментариях спросил, знаем ли мы, что это правда, или это только предположение. Я не смог найти точную ссылку на эту проблему, но нашел статью 2002 года, в которой говорилось об ошибке intellisense в строковом литерале. Это примерно на полпути вниз по этой странице.

2 голосов
/ 23 декабря 2008

На мой взгляд, это имеет смысл.

Есть много статических методов, которые принимают один аргумент. Было бы не очень хорошо вычислять квадратный корень, используя что-то вроде этого:

double d = 100.0;
Console.WriteLine("Square root of d is " + d.Sqrt());

Это уменьшит «сплоченность» с точки зрения дизайна ОО, что не является хорошей практикой. Было бы лучше разделить эту ответственность с классом Math.

double d = 100.0;
Console.WriteLine("Square root of d is " + Math.Sqrt(d));
...