Способы передачи параметров Типы, допускающие неопределенное значение Работа со строками Лекция 3
Способы передачи параметров Типы, допускающие неопределенное значение Работа со строками String Динамически изменяемые строки – класс StringBuilder Регулярные выражения – класс Regex
Способы передачи параметров Типы, допускающие неопределенное значение Работа со строками String Динамически изменяемые строки – класс StringBuilder Регулярные выражения – класс Regex
В C# три способа передачи параметров по значению ( по умолчанию ) по ссылке (ref) по ссылке (out) Для каждого из трех способов важно понимать особенности при передаче : ссылочного типа типа - значения
При передаче типа - значения Создается его локальная копия Любые модификации внутри метода не влияют на исходное значение При передаче ссылочного типа Передается значение ссылки Любые модификации внутри метода влияют на исходное значение Само значение исходной ссылки изменить нельзя ( присвоить ссылку на другой объект )
При передаче типа - значения Передается ссылка на объект Модификации объекта внутри метода влияют на исходные значения При передаче ссылочного типа Передается ссылка на ссылку Можно присвоить ссылке ссылку на другой объект out аналогичен ref, однако не предполагает предварительной инициализации переменной * ref и out имеют одинаковую сигнатуру. Поэтому нельзя создать 2 метода, которые будут отличаться только наличием у одного ref, а у другого out параметром
По значению : Console.WriteLine(Hello, World!); По ссылке : Swap(ref T x, ref T y){T z; z = x; x = y; y = z;} Не забывайте указывать ref и out при передаче фактических параметров ! T x, y; Swap(x, y); // неправильно T x, y; Swap(ref x, ref y); // правильно
Передача параметров
Для объявления переменного числа параметров используется params params params param_type[] param_name params должен идти в конце списка формальных параметров С таким параметром можно работать, как с обычным массивом На место params можно передавать : массив параметров параметры через запятую ничего Примеры : public static void WriteLine(string format, params object[] arg) {} string.Concat(arrayVar); string.Concat(new int[] {5,4,3}); string.Concat(Hello, C#, World); string.Concat();
= значение Имя _ типа имя _ переменной = значение В определении метода должны идти последними Примеры : public Complex(double re, double im = 0.0){} public void Vector3D(double x = 0.0, double y = 0.0, double z = 0.0){ } Complex c = new Complex(5.7); Complex c = new Complex(5.7, 8.3); Vector3D(5); Vector3D(5, 6); Vector3D(5, 9, 12); Компилируется в один метод с максимальным числом параметров, а не в несколько со всеми возможными вариантами параметров Добавление нового параметра со значением по умолчанию в существующий метод приведет к необходимости перекомпилирования всех зависимых сборок, использующих этот метод
Синтаксис : Имя _ метода ( имя _ параметра : значение [, имя _ параметра : значение …]) Позволяет задавать только указанные по имени параметры Можно менять порядок следования параметров Можно совмещать позиционную передачу параметров и передачу параметров по имени Примеры : public Complex (int re, int im) {…} Complex c = new Complex (im : 5, re : 6); void Vector3D(int x, int y=0, int z =0); Vector3D(3, y:4, z:5); // Передача по положению и по имени Vector3D(3, z:5); // Передача по положению, по имени и значения по умолчанию
Способы передачи параметров Типы, допускающие неопределенное значение Работа со строками String Динамически изменяемые строки – класс StringBuilder Регулярные выражения – класс Regex
Типы с неопределенным значением – расширение типов - значений (ValueType) неопределенным значением null Структура Nullable struct Nullable where T : struct, new() Свойства HasValue bool HasValue { get; } – определено ли значение или объект - null Value T Value {get; } - значение Синтаксис объявления Nullable Nullable value_type? value_type?- сокращенный вариант Примеры : ? int? nj = 5, nj = null; Nullable f = null; ? DateTime? ndt = GetNullableDate(), ndt2 = null;
Неопределенные значения в базах данных * Трехзначная логика bool? Возможность неопределенного возвращаемого значения Расширение типов - значений неопределенным значением
Существует неявное преобразование в value_type? из value_type Обратное преобразование - только явное : int? nj; int j = (int)nj; Свойства HasValue – показывающее определено ли значение и Value - значение int i; int? ni = 5; if (ni.HasValue) i = ni.Value; Значение по умолчанию - null Можно получать доступ ко всем членам объекта типа DateTime? d = new DateTime(); d.Value.AddDays(4);
Можно выполнять обычные операции ( переопределены ) int? + int? => int? Если одно из значений не определено (null), то и результат не определен Если оба определены, то результат – сумма этих значений Можно сравнивать с null if (ni == null) ni = 5;
object1 ?? object2 Если object1 равен null, то результатом этого выражения будет object2, иначе object1 Использование Присваивание значения по умолчанию, если не определен Применимо к ссылочным и Nullabe типам Примеры : int? a; int i = a ?? 5; Если a == null, то i = 5, иначе i = a.Value
Появился в C# 6 Применим к ссылочным и Nullabe типам string s = object1?.value1 Если object1 равен null, то результатом этого выражения будет s= null, иначе s = object1.value1 int? item = collection?[index]; Если collection равена null, то результатом этого выражения будет null, иначе (int?)collection[index] Использование Сильно сокращает запись public static string GetTrimedFio(Employee employee) { string trimedFio = employee?.Fio?.Trim(); if (employee != null && employee.Fio != null) trimedFio = employee.Fio.Trim(); else trimedFio = null; return trimedFio; }
Nullable Types
Способы передачи параметров Типы, допускающие неопределенное значение Работа со строками String Динамически изменяемые строки – класс StringBuilder Регулярные выражения – класс Regex Обработка исключений
String – ссылочный тип Функционирует как тип - значение Строка неизменяема Сравнение строк = == ==, != Сравнение содержимого ( посимвольно с учетом регистра ), а не ссылок на объект Конкатенация строк + или использование статического метода Concat() string s = s1 + еще одна строчка + s2; String s += добавленная строчка – создает новый экземпляр типа string Свойства: Свойство Length – возвращает длину строки ( только чтение ) Индексатор [ [[ [ ] – возвращает указанный символ в строке ( только на чтение ) char c = myString[5]; Статическое поле E EE Empty – представляет пустую строку string s = string.Empty;
Compare() Статический метод Compare() – сравнение строк, возможно с учетом культуры и регистра string result = string.Compare(string1, string2, new CultureInfo("en-US"), CompareOptions.IgnoreCase); IndexOf()LastIndexOf() Методы IndexOf(), LastIndexOf() – возвращают позицию символа или подстроки Contains() Метод Contains() – возвращает true, если строка содержит подстроку Format() Статический метод Format() – создание форматированной строки string result = String.Format( Температура {0:d}:\n в {1,11}: {2} градусов ", date, time, temp); Insert() Метод Insert() – возвращает новую строку, в которой указанная подстрока вставлена в указанную позицию string result = s.Insert(2, вставляемая подстрока ); Remove(), Replace() Методы Remove(), Replace() – возвращают новые строки, в которых удалена или замена подстрока Split() Метод Split() – разбивает строку на несколько строк по определенному символу Trim() Метод Trim() – удаляет все вхождения определенного набора символов сначала и с конца строки ToUpper(), ToLower() Методы ToUpper(), ToLower() – преобразование строки в верхний, нижний регистры ( возвращают новые строки ) Join() Метод Join() – объединяет коллекцию в строку использую разделитель между элементами int[] values = {5, 4189, 11434,.366 }; Console.WriteLine(string.Join(;", values)); IsNullOrEmpty()IsNullOrWhiteSpace() Статические методы IsNullOrEmpty(), IsNullOrWhiteSpace() – проверяют строку на пустоту ВНИМАНИЕ !!! Методы возвращают новый экземпляр string и не меняют текущую строку
Класс предназначен для работы с часто изменяющимися строковыми данными Представляет изменяемую строку символов Расположен пространстве имен System.Text Методы : Append() Append() – добавляет строковое представление типа ( подстроку ) в конец ( перегружен для различных типов данных ) AppendFormat() AppendFormat() – добавляет форматированную строку AppendLine() AppendLine() – добавляет строку и символ перевода строки Insert() Insert() – вставляет строковое представление типа ( подстроку ) в указанное место ( перегружен для различных типов данных ) Replace() Replace() – заменяет символы или подстроки на новые Clear() Clear() – очищает содержимое ToString() ToString() – возвращает содержащуюся строку В отличии от string меняет сам объект, а не возвращает новый при изменении данных
Применяется для форматирования вывода строки Console.Write(), Console.WriteLine(), string.Format(), stringBuilder.AppendFormat() Первый параметр – строка - шаблон Метки - заполнители {0}, {1}, {2} … Вместо меток подставляются параметры метода, следующие за строкой Следующие параметры нумеруются с 0 Метки - заполнители {0}, {1}, {2} могут идти в произвольном порядке и повторятся сколько угодно раз При недостаточности параметров будет вызвано исключение Console.Write(x = {0}, y = {2}, z = {1}, x ={0}, dx, dz, dy); Форматирование числовых данных C, c – денежный формат D, d – числовой формат ( с минимальный кол - вом цифр ) E, e – экспоненциальный формат числа F, f – формат числа с фиксированной точкой X, x – шестнадцатеричный формат P, p – представление в процентах G, g – общий формат string s = string.Format("{0:C}", value);
\ Управляющие символы начинаются с \ \n– перевод строки ( для Windows) \t– символ табуляция \r– возврат каретки \a– звуковой сигнал \\– символ \ \*– символ * \– символ string s = Дословные строки Отключение управляющих символов Сохраняет пробелы, символы перевода строк и т. д. string s string s на две строки ( да еще и с пробелами )
Появились в C# 6 (Visual Studio 2015) Используется для создания строк. Выглядит как шаблонная строка, которая содержит выражения. Интерполированное строковое выражение создает строку, заменяя содержащиеся выражения представлениями ToString() результатов выражений. Интерполированную строку проще понять Структура интерполированной строки $ { }... Примеры : string s = $"hello, {name} sb.Append($"Hello, {name}" ); Console.WriteLine($"{person.Name, 20} is {person.Age:D3} year {(person.Age == 1 ? "" : "s")} old.)
Работа со строками
Позволяет осуществлять поиск, замену, проверку, разбор строки, используя регулярные выражения Пространство имен System.Text.RegularExpressions Позволяет работать как с статическими методами, так и создать экземпляр класса для проведения множества однотипных операций, используя один и тот же паттерн Методы ( все методы экземпляра имеют и соответствующий статический вариант ): IsMatch() IsMatch() – проверяет строку на соответствие регулярному выражению ( статический метод и метод экземпляра ) Match() Match() – возвращает первое вхождение регулярного выражения в строку ( статический метод и метод экземпляра ) Matchs() Matchs() – возвращает коллекцию всех вхождений регулярного выражения в строку ( статический метод и метод экземпляра ) Replace() Replace() – заменяет все вхождения регулярного выражения на новую подстроку Split() Split() – разделяет строку на подстроки по позициям совпадения с регулярным выражениям ( найденная строка выкидывается ). Статический метод и метод экземпляра Примеры : Regex r = new bool ok = r.IsMatch(" "); bool validTel = string s = Regex.Replace(inputString, ); // Удаление недопустимых символов
Работа с регулярными выражениями