Почему символ dotnet. IsLower () статический метод?

Я предполагаю, что предлагаемое вами решение состоит в том, чтобы проверить, все ли буквенно-цифровые символы находятся внутри строки. Этот метод не будет работать, потому что вы также должны учитывать длину строки, потому что можно получить строку, которая содержит все буквенно-цифровые символы плюс один специальный символ.

Если не считать вложенных тысяч операторов if для обнаружения не алфавитно-цифровых символов, это решение работает:

(я предполагаю, что Text можно повторять в , используя циклы for на основе диапазона)

Вы можете использовать std::find_if

#include 
#include 
#include 
#include 

auto it = std::find_if(std::begin(Text), std::end(Text), [](const char c) {
    return std::isalnum(c) == 0; // Not alphanumeric
});

if (it == std::end(Text)) {
    std::cout << "Text is fine!";

} else {
    std::cout << "Text contains non-alphanumeric character: '" << *it << "'";
}

std::cout << std::endl;

6
задан Community 23 May 2017 в 11:44
поделиться

3 ответа

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

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

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

Se здесь подобный вопрос.

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

7
ответ дан 9 December 2019 в 20:50
поделиться

В моей точке зрения это действительно имеет смысл.

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

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

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

double d = 100.0;
Console.WriteLine("Square root of d is " + Math.Sqrt(d));
2
ответ дан 9 December 2019 в 20:50
поделиться

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

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

ПЕРЕИЗДАЙТЕ: у Меня было немного напыщенной речи здесь о разработчиках.NET, покоряющихся давлению от разработчиков IDE. Но видевший ответ Pop на этот вопрос я менее уверен в этом теперь.

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

3
ответ дан 9 December 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: