- •5. Обзор встроенных типов данных в с#. Применение встроенной функциональности типов данных.
- •6. Пространство имён System. Класс System.Math
- •7.Операции ввода-вывода. Формат вывода.
- •8. Арифметические операции. Операции отношений и логические операции. Операторы и выражения в c# .
- •Операторы
- •9.Массивы в с#. Одномерные массивы.
- •10.Класс System.Random, применение его методов для создания массива случайных чисел. Класс System.Array, использование его методов и свойства Length.
- •11. Двумерныемассивы в c#. Виды двумерных массивов и способы их определения. Способы создания двумерных массивов. Вывод матриц на экран по строкам.
- •12. Структуры в c#. Создание структур. Массивы структур.
- •13.Объект и его свойства. Характеристики ооп.
- •14.Определение классов в c#. Члены класса. Форма определения класса.
- •15.Конструкторы. Параметризованные конструкторы. Создание экземпляра класса. Использование оператора new.
- •16. Типы значений и ссылочные типы. Динамическое использование памяти: стеки и кучи. Упаковка и распаковка.
- •18. Определение методов класса. Модификаторы доступа к методам класса. Параметры методов класса, передача аргументов.
- •19. Модификаторы ref, out, params параметров методов.
- •20.Возвращение методами объектов класса. Возвращение методами массивов Возвращение методами объектов класса
- •Возвращение методами массивов
- •21. Общие (статические) члены класса. Доступ к общим членам. Ограничения на static-методы.
- •22.Цикл «Жизни». Область видимости и время существования переменных.
- •23. Преобразование и приведение типов данных.
22.Цикл «Жизни». Область видимости и время существования переменных.
До сих пор мы объявляли переменные либо в методе Main(), либо в методах класса. В C# разрешается объявлять переменные внутри любого блока. Любой блок определяет область объявления, или область видимости объектов. Область видимости также определяет и время существования (жизни) этих объектов. Самыми важными являются области видимости, которые определены классом и методом. Область видимости, определяемая методом, начинается с начала тела метода ({…}). Если метод имеет параметры, то они также относятся к области видимости метода. При объявлении переменной внутри области видимости мы ее локализируем, защищаем ее от неправомочного доступа и/или модификации. Эти правила области видимости обеспечивают основу для инкапсуляции.
Области видимости могут быть вложенными:
int x=53;
if (x >= 10)
{
double y =x* 20.54;
x *= 2;
Console. WriteLine(“x= ”+x”, y= ”+y);
}
Здесь переменная y объявлена в блоке оператора if. Внешняя область видимости (int x=53;) включает внутреннюю, т.е. x виден в if. Объекты, объявленные во внутренней области, невидимы вне ее. Если за if написать y=100; то будет ошибка.
Переменные создаются после входа в область видимости, а разрушаются при выходе из нее. Это означает, что переменная не будет хранить значение за пределами области видимости. Таким образом, переменная, объявленная внутри некоторого метода, не будет хранить значения между вызовами этого метода. И, аналогично, переменная, объявленная внутри какого-либо блока, потеряет свое значение по завершению этого блока.
Итак:
-
время существования переменной ограничивается ее областью видимости;
-
ни одна переменная, объявленная во внутренней области видимости, не может иметь имя, совпадающее с именем переменной, объявленной во внешней области видимости.
23. Преобразование и приведение типов данных.
Часто возникает необходимость переменной одного типа присвоить значение переменной другого типа. При этом нужно преобразовать данные из одного типа в другой. Преобразование между типами данных может двух видов: неявное и явное (автоматическое).
Неявное преобразование – это преобразование типов данных, которое явно не задано и выполняется без специально указанной команды, т.е. такие преобразования выполняются автоматически. Они никогда не приводят к потере или повреждению информации. Автоматическое преобразование будет выполнено, если:
– оба типа совместимы;
– тип переменной-приемника больше (т.е. имеет больший диапазон представления значений), чем тип источника.
При соблюдении этих двух условий выполняется преобразование с расширением, или расширяющее преобразование. Например, тип int – достаточно «большой» тип, чтобы сохранить значение типа byte или short. byte и int – это целочисленные типы, поэтому они совместимы. Преобразование типов из long в double является расширяющим, а обратное преобразование из double в long автоматически не выполняется, т.к. это преобразование не является расширяющим.
Разрешены следующие преобразования числовых типов:
-
sbyte (-128 до 127) к типам short, int, long, float, double, decimal;
-
byte (0-255) к типам short, ushort, int, uint, long, ulong, float, double, decimal;
-
short к типам int, long, float, double, decimal;
-
ushort к типам int, uint, long, ulong, float, double, decimal;
-
int к типам long, float, double, decimal;
-
uint к типам long, ulong, float, double, decimal;
-
long к типам float, double, decimal;
-
ulong к типам float, double, decimal;
-
char к типам ushort, int, uint, long, ulong, float, double, decimal;
-
float к типу double.
Явное преобразование или приведение к типу – это явно заданная инструкция компилятору преобразовать один тип в другой. Инструкция записывается так: (тип_приемника) выражение.
Например: double x, y;
x = 50, y = 30;
int z = (int) (x/y);
Если приведение приводит к сужающему преобразованию, то возможна потеря информации. Преобразование типов может встречаться и в выражениях, а не только при присваивании переменных. Преобразование типов выполняется на основе правил продвижения по «типовой» лестнице. Например, если один операнд имеет тип double, то и второй преобразуется в double, или, один операнд имеет тип uint, то и второй преобразуется в uint, иначе оба операнда преобразуются в значение типа int. Однако продвижение типов может иметь неожиданные последствия. Рассмотрим пример, где арифметическая операция включает два byte-значения. Тогда сначала byte-операнды «подтягиваются» до типа int, а затем вычисляется результат, который имеет тип int:
byte b;
b=5; b=(byte) (b*b); // (b*b) – подтягивается к int, необходимо
// приведение типов, а иначе будет int.