- •Тема 2.1.1 Синтаксис языка c#. Данные и операции над ними
- •Тема 2.1.1 Синтаксис языка c#. Данные и операции над ними 1
- •Какие типы данных присутствуют в c#?
- •Int[] mass;// объявление массива целых чисел mass
- •Какие типы данных встроены в c#?
- •Почему в c# типы данных являются одновременно и классами?
- •При каких условиях переменным одного типа можно присваивать значения другого типа?
- •Как в c# автоматизируется преобразование типов?
- •Как в c# объявляются и инициируются переменные?
- •Где в c# объявляются переменные?
- •Каково поведение локальных переменных в c#?
- •Как в c# объявляются константы?
- •Какие математические функции и константы встроены в c#?
- •Как в c# генерировать случайные числа?
- •Выводы:
Как в c# автоматизируется преобразование типов?
С помощью статических методов класса Convert из пространства имен System.
Класс Convert содержит 15 статических методов вида To <Type>, где Type может принимать значения от Boolean до UInt64 для всех встроенных типов, перечисленных выше в таблице. Например (ToBoolean(), ... ToInt32(), ... ToUInt64() ).
Возможно также преобразование в тип DateTime:
System.DateTime dat = Convert.ToDateTime("12.09.2011");
Console.WriteLine("Date = {0}", dat);
Результатом вывода будет строка: Date = 12.09.2011 0:00:00
Как в c# объявляются и инициируются переменные?
В C# переменные объявляются аналогично С++, как поля (члены) класса и как локальные переменные внутри главного или вложенных блоков функций.
Синтаксис объявления:
[<атрибуты>] [<модификаторы>] <тип> <список имен и, как правило, начальных значений переменных>;
Инициализация полей классов и элементов массивов не обязательна, но возможна.
Инициализация локальных переменных является обязательной.
Попытка использовать неинициализированную локальную переменную приводит к ошибкам, обнаруживаемым еще на этапе компиляции. Инициализация переменных, как правило, выполняется в момент объявления, хотя и может быть отложена.
Инициализацию можно осуществлять двояко – обычным присваиванием или в объектной манере. Во втором случае для переменной используется конструкция new и вызывается конструктор по умолчанию.
Статические переменные объявляются только как поля класса и, в отличие от С++, инициируются как обычные переменные.
Где в c# объявляются переменные?
В C# переменные объявляются только внутри классов или внутри функций – методов классов. Это локальные переменные, динамические или статические. Нет глобальных переменных на уровне модуля, как в С++.
При необходимости сохранения и передачи данных вне функций можно воспользоваться статическими полями классов, например, класса Program, в который входит функция Main. В отличие от С++, внутри функций статические переменные запрещены.
Блок ограничивается фигурными скобками.
Каково поведение локальных переменных в c#?
Выделение памяти, область видимости и начало жизни переменной, объявленной в блоке (локальной переменной в функции), происходит не в момент входа в блок, а лишь тогда, когда достигается точка объявления локальной переменной.
Завершение жизни и области видимости происходит после выхода из этого блока.
Момент освобождение памяти непредсказуем, этим занимается сборщик мусора.
В отличие от С++, внутри блоков нельзя переобъявлять внешние переменные, а после завершения блока нельзя переобъявлять внутренние переменные. Однако можно переобъявлять переменные в блоках, не вложенных один в другой.
Переменные, объявленные в заголовке цикла for локальны в блоке, составляющем тело этого цикла.
Внимание! Не запрещено, чтобы имена переменных, объявленных внутри функций-членов класса, совпали с именами полей этого класса. Тогда они переобъявляют одноименные переменные-члены класса, начиная с места своего объявления. Это может привести к ошибкам из-за путаницы имен!
Как в c# объявляются константы?
Так же, как в С++.
Чем операции и выражения в C# отличаются от операций и выражений в С++?
Отсутствует операторное выражение. Запись операторов через запятую допускается только в списке выражений, показывающих, как меняются счетчики цикла for на каждом шаге выполнения.
Добавлены операции checked и unchecked, применимые к выражениям.
Ключевое слово checked используется для явного включения проверки переполнения при выполнении арифметических операций и преобразований с данными целого типа.
Ключевое слово unchecked используется для подавления проверки переполнения при выполнении арифметических операций и преобразований с данными целого типа.
Если в непроверяемом контексте результатом выполнения выражения является значение, выходящее за допустимые пределы значений конечного типа, то результат усекается.
Например: unchecked { int val = 2147483647 * 2; }
Так как приведенное выше вычисление выполняется в блоке unchecked, то факт превышения результатом размера целого типа игнорируется и переменной val присваивается значение -2. По умолчанию обнаружения переполнения включено, что равноценно использованию ключевого слова checked.
Ключевые слова checked и unchecked могут быть также использованы в качестве оператора:
int val = unchecked( 2147483647 * 2);
Операции в выражениях выполняются слева направо, с учетом приоритетов.
Особо интересен случай с первичными операциями x++ x--. Так же, как в С++, сначала используется значение x, а затем оно увеличивается или уменьшается на 1. Однако, в отличие от С++, это изменение происходит не после выполнения всего выражения, а сразу после выполнения этих операций. Из этого следует, что для int i=0; k=0; после выполнения оператора k=i++ +i; переменная k примет значение 1, а не 0, как это было бы в С++.
Приоритет |
Категория |
Операции |
Порядок |
0 |
Первичные |
(expr) x.y f(x) a[x] x++ x-- new sizeof(t) typeof(t) checked(expr) unchecked(expr) |
Слева направо |
1 |
Унарные |
+ - ! ~ ++x --x (T)x |
Слева направо |
2 |
Мультипликативные (Умножение) |
- * / % |
Слева направо |
3 |
Аддитивные (Сложение) |
+ - |
Слева направо |
4 |
Сдвиг |
<< >> |
Слева направо |
5 |
Отношения, проверка типов |
< > <= >= is as |
Слева направо |
6 |
Эквивалентность |
== != |
Слева направо |
7 |
Логическое |
& |
Слева направо |
8 |
Логическое исключающее ИЛИ (XOR) |
^ |
Слева направо |
9 |
Логическое ИЛИ (OR) |
| |
Слева направо |
10 |
Условное И |
&& |
Слева направо |
11 |
Условное ИЛИ |
|| |
Слева направо |
12 |
Условное выражение |
? : |
Справа налево |
13 |
Присваивание |
= *= /= %= += -= <<= >>= &= ^= |= |
Справа налево |
Перегрузка операций производится так же, как в С++, но нельзя перегружать операцию присваивания. Кроме этого нельзя перегружать операторы ?:, ->, new, is, sizeof, typeof.
Операция sizeof возвращает размер значимых типов, заданный в байтах. Но она может выполняться только в небезопасных блоках. Поэтому проект, в котором она может использоваться, должен быть скомпилирован с включенным свойством /unsafe.
Все арифметические классы обладают статическими полями MinValue и MaxValue, позволяющими определить диапазон значений переменных арифметических типов.
Правила работы с логическими выражениями в языках C# и C++ имеют принципиальные различия, так как в C# неявных преобразований к логическому типу bool нет даже для целых арифметических типов.