C# : Неизменяемость строк

Попробуйте ответить на вопрос, что выведет на экран следующий код?

var company = "hexlet";
company.ToUpper(); // в верхний регистр
Console.WriteLine(company); // => ?

Если ваш ответ, "HEXLET", то нам есть о чем поговорить) Эта программа выведет "hexlet". Почему?

Строки в C# неизменяемы. Не существует способа и методов, способных изменить саму строку. Любой метод строки может только вернуть новую строку. Основная причина, почему так сделано – производительность. Строки, как и примитивные типы данных нельзя менять практически ни в одном современном языке.

Вторая причина связана с простотой кода. Когда вместо изменения создаются новые данные на основе старых, то код проще анализировать и модифицировать. Особенно когда с данными происходит много манипуляций, с этим вам еще предстоит столкнуться.

Но как же все таки поступать, если данные нужно поменять? Для этого достаточно заменить значение переменной:

var name = "HODOR";
name = name.ToLower();
Console.WriteLine(name); // => "hodor"

С другой стороны, именно в такой ситуации можно создать новую переменную, с другим именем.

var name = "HODOR"
var processedName = name.ToLower();
Console.WriteLine(processedName); // => "hodor"

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

Задание

Данные, вводимые пользователями в формах, часто содержат лишние пробельные символы в конце или начале строки. Кроме того, пользователи могут вводить одно и тоже в разном регистре, что потом мешает работе с данными. Поэтому перед тем как добавлять их, данные обрабатывают (говорят нормализуют). В базовую обработку входят два действия:

  • Удаление концевых пробельных символов с помощью метода Trim(), например, было: " hexlet\n ", стало: "hexlet"
  • Приведение к нижнему регистру с помощью метода ToLower(). Было: "SUPPORT@hexlet.io", стало: "support@hexlet.io"`.

Нормализуйте содержимое переменной email, обработав его по схеме, указанной выше. Распечатайте то, что получилось, на экран.

Как с вами связаться? 🙃

Команда проекта находится в телеграм-сообществе по ссылке https://ttttt.me/HexletLearningBot. Там можно задать любой вопрос и повлиять на проект

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "Обсуждение". Как правильно задать вопрос:

В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

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

Прочитал урок — ничего не понятно 🙄

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

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются

Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт

Loading...

Ваше упражнение проверяется по этим тестам

1#load "/src/Init.csx"
2#load "/src/RedirectOutput.csx"
3#load "Exercise.csx"
4
5;
6using PowerAssert;
7
8var output = capturedConsoleOutput.ToString().Trim();
9Console.SetOut(originalStdOut);
10Console.Write(capturedConsoleOutput);
11
12PAssert.IsTrue(() => output == "support@hexlet.io");
13

Решение учителя откроется через:

20:00
waiting_clock