Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование. Введение в разработку на C#. Учебное пособие
.pdf
Встроенные типы данных
Тип данных Диапазон
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
