Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование. Введение в разработку на C#. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Встроенные типы данных
Тип данных Диапазон
byte 0 .. 255 sbyte -128 .. 127 short -32,768 .. 32,767 ushort 0 .. 65,535 int -2 147 483 648 .. 2 147 483 647 uint 0 .. 4,294,967,295 long -9 223 372 036 854 775 808 ..
9 223 372 036 854 775 807
ulong 0 .. 18 446 744 073 709 551615 float -3,402823e38 .. 3,402823e38 double -1,79769313486232e308 .. 1,79769313486232e308
Таблица 2.1
decimal -79228162514264337593543950335 ..
79228162514264337593543950335
char Символ Юникода. string Строка символов Юникода. bool true или false object Объект
Типы в С# также подразделяет на две другие категории: размерные (их обычно называют «по значению») значимые и ссылочные. Главное различие между ними – это методика сохранения их значений в памяти. Значимые типы (типы по значению) хранят свое фактическое значение в стеке. Ссылочные типы сохраняют в стеке только адрес объекта, а сам объект хранится в «куче». «Куча» (heap – англ.) – это основная память программы, доступ к которой может осуществляться намного медленнее, чем к стеку.
Стек – это структура данных, которая хранит элементы в соответст­вии с принципом «первым зашел – последним вышел» (ситуация, проти­воположная очереди). Стек относится к области памяти, поддерживаемой процессором, в которой сохраняются локальные переменные. Доступ к стеку намного быстрее, чем к общей области памяти, поэтому использо-
21
вание стека для хранения данных дает серьезный выигрыш вашей про­грамме. В С# типы по значению (например, целые числа) размещаются в стеке: для их значений определена область в стеке, а доступ к ней осуще­ствляется по названию переменной.
Ссылочные типы (например, объекты) размещаются в «куче». «Куча» – это часть оперативной памяти вашего компьютера. Доступ к ней несколько медленнее, чем к стеку. Когда объект размещен в «куче», то переменная хранит только адрес объекта. Этот адрес находится в стеке. По адресу программа может получить доступ к самому объекту, все данные которого хранятся в общем куске памяти (куче).
До появления платформы .NET от программиста требовалось не только создавать объект в памяти, но и собственноручно удалять его по окончании использования. С приходом концепции виртуальных машин подход изменился. Появились «сборщики мусора».
«Сборщик мусора» удаляет объекты, находящиеся в стеке, каждый раз, когда соответствующая переменная уже не требуется и выходит за область видимости. Таким образом, если объявить локальную переменную в пределах функции, то объект будет помечен как объект для «сборки мусора». И он будет удален из памяти, когда завершится работа функции. Объекты в «куче» тоже зачищаются сборщиком, после того как ссылка на них будет разорвана.
22
2.2. Пространства имен
Пространство имен (namespace) – концепция, позаимствованная из C++ и позволяющая обеспечить уникальность всех имен, используемых
в конкретной программе или проекте. Иногда программисту при работе над крупным проектом не хватает удобочитаемых глобальных имен или нужны библиотеки классов сторонних разработчиков, в которых конфликтуют имена. Допустим, вы работаете над крупным проектом на
С# и приобрели (в виде DLL) пару библиотек классов фирм Bovary Enterprises и Karenina Software. Обе содержат класс SuperString,
который совершенно по-разному реализован в каждой из DLL, но полезен и в той, и в другой версии. К счастью, такое дублирование – не проблема, так как обе компании следовали принципам С#: использовали пространства имен. Bovary поместила код своего класса SuperString в описание имени класса, подобное такому:
namespace BovaryEnterprises.VeryUsefulLibrary { class SuperString ... }
Нечто подобное проделала и Karenina:
namespace KareninaSoftware.HandyDandyLibrary { class SuperString ... }
В обоих случаях сначала идет имя компании, затем название продукта. В ваших программах, использующих эти библиотеки, можно обращаться к конкретному классу SuperString через полное имя:
BovaryEnterprises.VeryUsefulLibrary.SuperString
или
KareninaSoftware.HandyDandyLibrary.SuperString
23
Использование пространств имен было бы довольно вредным явлением, если б не существовал способ уменьшить объем ввода с клавиатуры. Для этого предназначено ключевое слово using. Пространство имен указывается один раз в инструкции using, затем это пространство имен можно не вводить при обращении к его классам. Вот альтернативный вариант программы «Hello world» на С#:
ConsoleHelloWithUsing.cs //-------------------------------------------------­// ConsoleHelloWithUsing.cs (C)2001 by Charles Petzold //--------------------------------------------------
using System; class ConsoleHelloWithUsing { public static void Main() { Console.WriteLine("Hello, world!"); } }
Если в проекте два различных класса SuperString, из затруднения выводит использование псевдонимов с ключевым словом using:
using Emma = Bovary.VeryUsefulLibrary; using Anna = Karenlna.HandyDandyLibrary;
Теперь к этим двум классам можно обращаться как: Emma.SuperString и Anna.SuperString
Более 90 пространств имен, определенных в .NET Framework, начинаются со слова System и 5 – со слова Microsoft.
Пространства имен даже позволяют давать имена, уже задействованные в .NET Framework, собственным классам. Сама .NET Framework также повторно использует некоторые имена классов. Так, она содержит три класса Timer, находящиеся в пространствах имен System.Timers, System.Threading и System.WindowsForms.
Что происходит с классами, определенными без использования пространств имен, такими как ConsoleHelloWorld и
24
ConsoleHelloWithUsing в наших примерах? Эти имена классов входят в глобальное пространство имен (global namespace). Это не проблема для небольших самодостаточных программ, подобных этим.
2.3. Арифметические операции
Различают 5 операций, выполняющих арифметические действия (табл. 2.2) над числами [3].
Таблица 2.2
Арифметические операции
Операция Назначение Пример
+ Сложение z = x + y
- Вычитание z = x - y
* Умножение z = x * y
/ Деление z = x / y
% Деление по модулю z = x % y
Операция – это конструкция в языках программирования, которая аналогична по записи математическим операциям, то есть особый способ записи некоторых действий. Чаще других используются арифметические, логические и операции на строках. В отличие от функций, операции чаще являются базовыми элементами языка и обозначаются разными символами пунктуации, а не алфавитно­цифровыми. Терминология, однако, несколько отличается от одного языка к другому.
Операция – это та же функция, которая записывается особым образом. По этой причине необходимо иметь возможность определять операции для произвольных типов таким же образом, как и методы – чтобы можно было работать с ними точно так же, как и с простыми типами. Эта возможность называется «перегрузка операций» и имеется в большинстве языков 4–5 поколений. В таких языках транслятор, фактически, подставляет вместо выполнения операции вызов соответствующей ей функции.
25
Операции делятся по количеству принимаемых аргументов на:
унарные – один аргумент (отрицание, унарный минус)
бинарные – два аргумента (сложение, вычитание, умножение и
т.д.)
тернарные – три аргумента ("условие ? выражение1 : выражение2")
Поскольку операции аналогичны по записи алгебраическим выражениям, для них, как и для последних, существует 3 варианта синтаксиса:
префиксная (+ab) форма;
инфиксная (a+b) форма;
постфиксная (польская) (ab+) форма;
Для бинарных и тернарных (с 3 операндами) операций в большинстве случаев используют инфиксную нотацию – по той простой причине, что она принята в математике и наиболее привычна большинству людей. Для унарных операций инфиксной нотации не существует, и, как правило, используется префиксная.
Помимо обычных операций сложения, вычитания, умножения и деления, в C# предусмотрены более сложные математические функции. Все они собраны в единую библиотеку Math. Она предоставляет константы и статические методы для тригонометрических, логарифмических и иных общих математических функций [4]. Основной набор функций из библиотеки представлен ниже:
Abs(Decimal) – Возвращает абсолютное значение числа Decimal. Abs(Double) – Возвращает абсолютное значение числа двойной точно-
сти с плавающей запятой. Abs(Int16) – Возвращает абсолютное значение 16-разрядного знакового целого числа. Abs(Int32) – Возвращает абсолютное значение 32-разрядного знакового целого числа. Abs(Int64) – Возвращает абсолютное значение 64-разрядного знакового целого числа.
26
Abs(SByte) – Возвращает абсолютное значение 8-битового целого числа со знаком. Abs(Single) – Возвращает абсолютное значение числа одинарной точно­сти с плавающей запятой.
Acos – Возвращает угол, косинус которого равен указанному числу. Asin – Возвращает угол, синус которого равен указанному числу. Atan – Возвращает угол, тангенс которого равен указанному числу. Atan2 – Возвращает угол, тангенс которого равен отношению двух ука-
занных чисел.
BigMul – Умножает два 32-битовых числа. Ceiling(Decimal) – Возвращает наименьшее целое число, которое боль-
ше или равно заданному десятичному числу. Ceiling(Double) – Возвращает наименьшее целое число, которое больше или равно заданному числу с плавающей запятой двойной точности.
Cos – Возвращает косинус указанного угла. Cosh – Возвращает гиперболический косинус указанного угла. DivRem(Int32, Int32, Int32) – Вычисляет частное двух 32-разрядных зна-
ковых целых чисел и возвращает остаток в выходном параметре. DivRem(Int64, Int64, Int64) – Вычисляет частное двух 64-разрядных зна­ковых целых чисел и возвращает остаток в выходном параметре.
Exp – Возвращает e, возведенное в указанную степень. Floor(Decimal) – Возвращает наибольшее целое число, которое меньше
или равно указанному десятичному числу. Floor(Double) – Возвращает наибольшее целое число, которое меньше или равно заданному числу двойной точности с плавающей запятой. IEEERemainder – Возвращает остаток от деления одного указанного числа на другое указанное число. Log(Double) – Возвращает натуральный логарифм (с основанием e) ука- занного числа. Log(Double, Double) – Возвращает логарифм указанного числа в систе­ме счисления с указанным основанием. Log10 – Возвращает логарифм с основанием 10 указанного числа.
27
Max(Byte, Byte) – Возвращает большее из двух 8-битовых целых чисел без знака. Max(Decimal, Decimal) – Возвращает большее из двух десятичных чисел. Max(Double, Double) – Возвращает большее из двух чисел двойной точ­ности с плавающей запятой. Max(Int16, Int16) – Возвращает большее из двух 16-битовых целых чи­сел со знаком. Max(Int32, Int32) – Возвращает большее из двух 32-битовых целых чи­сел со знаком. Max(Int64, Int64) – Возвращает большее из двух 64-битовых целых чи­сел со знаком. Max(SByte, SByte) – Возвращает большее из двух 8-битовых целых чи­сел со знаком. Max(Single, Single) – Возвращает большее из двух чисел одинарной точ­ности с плавающей запятой. Max(UInt16, UInt16) – Возвращает большее из двух 16-битовых целых чисел без знака. Max(UInt32, UInt32) – Возвращает большее из двух 32-битовых целых чисел без знака. Max(UInt64, UInt64) – Возвращает большее из двух 64-битовых целых чисел без знака. Min(Byte, Byte) – Возвращает меньшее из двух 8-битовых целых чисел без знака.
Min(Decimal, Decimal) – Возвращает меньшее из двух десятичных чисел. Min(Double, Double) – Возвращает меньшее из двух чисел двойной точ-
ности с плавающей запятой. Min(Int16, Int16) – Возвращает меньшее из двух 16-битовых целых чи­сел со знаком. Min(Int32, Int32) – Возвращает меньшее из двух 32-битовых целых чи­сел со знаком. Min(Int64, Int64) – Возвращает меньшее из двух 64-битовых целых чи­сел со знаком.
28
Min(SByte, SByte) – Возвращает меньшее из двух 8-битовых целых чи­сел со знаком. Min(Single, Single) – Возвращает меньшее из двух чисел одинарной точ­ности с плавающей запятой. Min(UInt16, UInt16) – Возвращает меньшее из двух 16-битовых целых чисел без знака. Min(UInt32, UInt32) – Возвращает меньшее из двух 32-битовых целых чисел без знака. Min(UInt64, UInt64) – Возвращает меньшее из двух 64-битовых целых чисел без знака.
Pow – Возвращает указанное число, возведенное в указанную степень. Round(Decimal) – Округляет десятичное значение до ближайшего цело-
го. Round(Double) – Округляет заданное число с плавающей запятой двой­ной точности до ближайшего целого. Round(Decimal, Int32) – Округляет десятичное значение до указанного числа дробных разрядов. Round(Decimal, MidpointRounding) – Округляет десятичное значение до ближайшего целого. Параметр задает правило округления значения, ес­ли оно находится ровно посредине между двумя другими числами. Round(Double, Int32) – Округляет значение двойной точности с пла­вающей запятой до заданного количества дробных разрядов. Round(Double, MidpointRounding) – Округляет заданное значение числа двойной точности с плавающей запятой до ближайшего целого. Пара­метр задает правило округления значения, если оно находится ровно посредине между двумя другими числами. Round(Decimal, Int32, MidpointRounding) – Округляет десятичное значе­ние до указанного числа дробных разрядов. Параметр задает правило округления значения, если оно находится ровно посредине между двумя другими числами. Round(Double, Int32, MidpointRounding) – Округляет значение двойной точности с плавающей запятой до заданного количества дробных разря-
29
дов. Параметр задает правило округления значения, если оно находится ровно посредине между двумя другими числами. Sign(Decimal) – Возвращает значение, определяющее знак десятичного числа. Sign(Double) – Возвращает значение, определяющее знак числа двойной точности с плавающей запятой. Sign(Int16) – Возвращает значение, определяющее знак 16-разрядного знакового целого числа. Sign(Int32) – Возвращает значение, показывающее знак 32-разрядного знакового целого числа. Sign(Int64) – Возвращает значение, показывающее знак 64-разрядного знакового целого числа. Sign(SByte) – Возвращает значение, определяющее знак 8-битового це­лого числа со знаком. Sign(Single) – Возвращает значение, определяющее знак числа одинар­ной точности с плавающей запятой.
Sin – Возвращает синус указанного угла. Sinh – Возвращает гиперболический синус указанного угла. Sqrt – Возвращает квадратный корень из указанного числа. Tan – Возвращает тангенс указанного угла. Tanh – Возвращает гиперболический тангенс указанного угла. Truncate(Decimal) – Вычисляет целую часть заданного десятичного
числа. Truncate(Double) – Вычисляет целую часть заданного числа двойной точности с плавающей запятой.
Константы: E – Представляет основание натурального логарифма, определяемое константой e. PI – Представляет отношение длины окружности к ее диаметру, опреде­ляемое константой π.
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]