Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_ООП_2_1_1 Синтаксис языка C#. Данные и опе...doc
Скачиваний:
2
Добавлен:
13.11.2019
Размер:
208.9 Кб
Скачать

Как в 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 нет даже для целых арифметических типов.