О string и char. Синтаксис C#

Серия Введение в основы программирования.

Из этой лекции вы узнаете о ссылочном типе данных — string и примитивном — char.

Переменные с ссылочным типом данных string — это переменные, предназначенные для хранения значений в виде строк. Строкой считается любое значение, с форматом представления в виде любых символов заключенных между двойными кавычками, даже если это один символ.

Объявление и инициализация переменной с типом данных string ничем ни отличается от тех же операций с другими типами данных.

Так выглядит инициализация переменной с строковым значением

static void Main(string[] args)

{

string text = "Bill";

}

В отличии от числовых значений, строковое значение, не является набором цифр, и поэтому не может хранится как числовое значение.

Для хранения строгого значения используется следующая схема. Строковое значение разбивается на отдельные символы, в том числе, знаки препинания, пробелы и т.д., и каждый символ преобразуется в число. После преобразования получается массив из чисел, которые записываются в специальную область памяти — куча. Соответствие символа и его десятичного, числового представления указаны в таблице символов ASCII(1 байт) или UNICODE(2 байта).

Для доступа к строковому значению, в стеке, создается объект-ссылка с именем, в котором указано, где, в куче, находятся символы.

Ссылка приведена для визуального оформления

Само хранение строкового значения можно представить как блок из мини переменных, где каждая мини переменная, в виде числа, хранит один символ. Такая мини переменная называется — элемент строкового значения. Доступ к элементу осуществляется по индексу, который представляет собой порядковый номер элемента в значении. Нумерация индексов начинается с нуля.

Строковое значение «Bill», в памяти компьютера будет представлено следующим набором числовых значений — 66 105 108 108.

Для доступа к отдельному элементу указывается имя значения и соответствующий индекс, в формате записи — имя переменной [индекс элемента]

static void Main(string[] args)

{

string text = "Bill";

Console.WriteLine($"Имя строка - {text[0]},{text[1]},{text[2]},{text[3]}");

}

Здесь, для вывода строки применена интерполяции.

Элемент строкового значения хранится в виде значения с символьным типом данных — char. Таким образом, значение с типом данных string — это массив элементов с типом данных char.

static void Main(string[] args)

{

string text = "Bill";

Console.WriteLine("Тип данных: " + text[0].GetTypeCode());

}

Здесь, метод GetTypeCode(), указывает на тип данных значения, хранимого в элементе с индексом 0.

Символьный тип —char, является очень интересным типом данных. Значения этого типа данных хранится как числовое значение, но на экран выводится — его графическое представление. Другими словами, для компьютера значение типа данных —char, является числом, но пользователь на экране видит символ.  Это некий мостик, между строковыми и числовыми значениями.

Значения с типом данных char относятся к примитивным типам данных и хранятся в стеке. Формат записи —  единственный символ, обрамленный одинарными кавычками. Размер выделяемой памяти составляет один или два байта.

Инициализация переменной

static void Main(string[] args)

{

char symbolA = 'A';

}

Соответствие символа и его числового значения

static void Main(string[] args)

{

char symbolA = 'A';

Console.WriteLine("Переменная символа 'A' = " + symbolA);

int number = symbolA;

Console.WriteLine("Числовое значение переменной symbolA = " + number);

}

При изменении числового значение меняется символ.

static void Main(string[] args)

{

char symbolA = 'A';

Console.WriteLine("Переменная символа 'A' = " + symbolA);

int number = symbolA + 1;

char value = (char)number;

Console.WriteLine("Символ 'A' + 1 = " + value);

}

Здесь, переменная number инициализирована числом, соответствующим символу 'A' — 65, добавим к этому значению единицу. Результатом такой операции станет число 66, которое соответствует символу 'B'. Для преобразования числового значения в значение с типом данных char используется явное привидение типов

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

static void Main(string[] args)

{

string text = "Bill";

Console.WriteLine($"Размер значения - {text.Length}");

}

Зная, что строковое значение — массив значений символьного типа, а также размер массива, можно производить некоторые действия над строковым значением. В C# такие действия ограничены, но, к примеру в языке С++, можно заменять один символ другим. Возможности обработка строки, на различных языках программирования существенно отличается, иначе зачем столько языков программирования.

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

Примем, что строковое значение состоит из одного предложение, заканчивающееся на один из вышеперечисленных знаков.

Последний символ предложения хранится в последнем элементе значения. Для получения доступа к этому элементу нам необходимо знать его индекс. В этом нам поможет свойство Length, в виде конструкции «Length-1». Дело в том, что нумерация в Length начинается не с нуля, как у индексов элементов, а с единицы. Дабы привести в соответствие числовые ряды, Length уменьшается на единицу.

Полученный индекс последнего элемента запишем в отдельную переменную «int idx = text.Length-1;». Таким образом в операции отношения сравнивается последний элемент строкового значения с символами окончания предложения.

static void Main(string[] args)

{

string text = "Hello, world!";

int idx = text.Length - 1;

if (text[idx] == '.')

{

Console.WriteLine("Предложение повествовательное");

}

if (text[idx] == '!')

{

Console.WriteLine("Предложение побудительное");

}

if (text[idx] == '?')

{

Console.WriteLine("Предложение вопросительное");

}

}

В заключении.

Строковое значение — набор отдельных элементов. Каждый элемент строкового значения имеет свой порядковый номер —индекс, по которому можно получить доступ к содержимому элемента. Нумерация начинается с нуля. Формат записи значения — любые символы заключенные в двойные кавычки. Количество элементов равно размер значения.

Значения с типом данных char, представляет собой значение в графическом виде, отображающее символ, но хранимое как число. Символы и соответствующие им числовые значения приведены в таблице ASCII. Формат записи — единственный символ, заключенный в одинарные кавычки.

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий

Переменные с ссылочным типом данных string — это переменные, предназначенные для хранения значений в виде строк.

Переменные хранят ссылки на объекты строк, которые уже хранят значение строки. В этом суть ссылочных типов.


даже если это один символ

Даже если ни одного символа (string.Empty).


Объявление и инициализация переменной с типом данных string ничем ни отличается от тех же операций с другими типами данных.

...и тут же показывается создание строки литералом - чем не особенность?


Для доступа к строковому значению, в стеке, создается объект-ссылка с именем

Просто ссылка, адрес в куче, никакой объект не создается. И не обязательно в стеке, ведь есть боксинг и возможность сделать поле ссылочного типа ссылкой на строку.


В C# такие действия ограничены, но, к примеру в языке С++, можно заменять один символ другим. Возможности обработка строки, на различных языках программирования существенно отличается, иначе зачем столько языков программирования.

Языки тут совершенно не при чем, иммутабельность - это особенность дизайна типа string, адаптированный для мутабельности тип - StringBuilder.

раскрыть ветку (5)
0
Автор поста оценил этот комментарий

Даже если ни одного символа (string.Empty).

А ещё они могут никуда не ссылаться, string.IsNull, так-то Empty какое-никакое но значение.

Вообще довольно сложно и в случае с С# в начале не сильно то и нужно объяснять устройство памяти, так как код исполняется на стековой машине, а там аж два стека, один стэк, это стэк "исполнения", а другой стэк вызовов. А ещё на примитивном хеллоу-ворде запускается целый пул потоков и навярняка, ещё и их стэки создаются для каждой нити, правда я сильно не знаю.

Про char тут тоже упущено. char - может работать сразу Unicode (UTF-16) ,а не тупо с ascii.

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Стек вызовов к памяти и переменным не имеет отношения. Да и тредпул никак не влияет на эту информацию. А вот ссылочнлсть имеет специальную семантику и отражена в языке.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

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

Зачем это делаю, просто из любопытства.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Да, вы правы, оба стека, по сути - стеки вызовов) Однако, как это влияет на работу с ссылочными типами для программиста? Это ведь полностью прозрачно работает.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Никак. =) Вы молодец.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества