Файл: Типы данных, пространство имен, классификация типов среды .NET.pdf
Добавлен: 23.04.2023
Просмотров: 107
Скачиваний: 3
СОДЕРЖАНИЕ
eStatus, boxVolume, arraySize, intI.[2]
Типы данных, пространство имен, классификация типов среды .NET
Объявление переменных, синтаксис элементарных типов, безопасность типов
Арифметические операции. Приоритеты операций. Логические операции
Размерные и ссылочные типы, особенности использования стека и кучи
Введение
Данная тема является актуальной для меня, так как подробное изучение ее будет являться одним из этапов обучения программированию. Рассмотрим работу с переменными на одном из популярных языков программирования – C#. Ввиду того, что во многих доступных русскоязычных книгах указан запрет на воспроизводство информации в любом виде – расширим зону поиска информации, прибегнув и к англоязычным изданиям в том числе.
Цель данной курсовой работы – пролить свет на понятие переменных, понять зачем они нужны в процессе составления программ, узнать об их типах.
Поставим перед собой ряд основных задач рассмотреть: понятие переменной; типы переменных; объявление переменных и синтаксис; область действия переменных; арифметические и логические операции с переменными; размерные и ссылочные типы переменных; понятие стека, кучи, сборщика мусора; приведение типов.
Из источников – будем пользоваться книгами и учебниками известных издательств, не вызывающих сомнений, любой вопрос постараемся рассмотреть комплексно, черпая информацию и проверяя ее критически.
Понятие переменной
Понятие переменная является одним из ключевых в программировании. Что это такое и для чего нужно? Любая программа работает с данными (числами, строками), которые могут вводиться пользователем или жестко прописываться в коде программы. Эти данные надо где-то хранить. Где? Постоянные данные хранятся в том или ином виде на жестком диске, а временные данные - в оперативной памяти компьютера.
Под временными данными я понимаю все, что необходимо программе для расчетов. Дело в том, что процессор умеет выполнять математические операции только над регистрами процессора (это как бы переменные внутри процессора) или оперативной памятью. Поэтому, чтобы произвести расчеты над постоянными данными, их необходимо загрузить в оперативную память. Допустим, что мы загрузили данные в память, но как с ними теперь работать? В языке ассемблера для этого используются адреса памяти, где хранятся данные, а в высокоуровневых языках, к которым относится и С#, такие участки памяти имеют имена. Имя, которое служит для адресования памяти, и есть переменная. Имя проще запомнить и удобнее использовать, чем числовые адреса.[1]
Существует распространенный способ формирования идентификаторов, именуемый венгерской нотацией (предложен Чарльзом Симони, венгром по национальности) и широко используемый в англоязычной литературе. Идентификатор составляется из последовательности слов, часто сокращенных, определяющих смысловую принадлежность идентификатора, тип данных и т.п. Например:
eStatus, boxVolume, arraySize, intI.[2]
What is a variable? A typical program uses various values that change during its execution. For example, we create a program that performs some calculations on the values entered by the user.[3] The values entered by one user will obviously be different from those entered in by another user. This means that when creating the program, the programmer does not know what values will be introduced as input, and that makes it necessary to process all possible values a user may enter. When a user enters a new value that will be used in the process of calculation, we can preserve it (temporarily) in the random access memory of our computer. The values in this part of memory change (vary) throughout execution and this has led to their name - variables.[4]
Исходя из вышеперечисленного можно сделать вывод о том, что в принципе полноценное программирование невозможно без переменных. Любая компьютерная программа должна отвечать поставленным перед ней требованиям и решать многообразие задач. Личный опыт показывает, что даже элементарная программа для выполнения лабораторных работ по построению депрессионных кривых фильтрации должна иметь поле ввода исходных данных (переменных), изменяющихся в зависимости от геометрических размеров плотины и отметок уровней воды. Так же, по моему мнению, логично все переменные называть читаемыми именами, чтобы впоследствии легко воспринимать код хотя бы самому.
Типы данных, пространство имен, классификация типов среды .NET
Прежде чем приступить к детальному изучению CTS среды .NET, рассмотрим общую классификацию типов, используемых в ней. Их иерархическая структура представлена на рис.1.
Рисунок №1 - Иерархия типов среды .NET
Корнем иерархии является класс System.Object, от которого прямо или косвенно унаследованы все типы .NET. Объявляя или используя любой тип, вы можете быть всегда уверены в том, что его самым дальним предком является System.Object.[5]
В .NET используется общая система типов (Common Туре System, CTS). Почему именно "общая"? Дело в том, что приложения для этой платформы можно разрабатывать на разных языках. Раньше было очень сложно разрабатывать приложения сразу на нескольких языках, потому что у каждого была своя система типов, и хранение строки, скажем, в Delphi и в С++ происходило по-разному. Благодаря общности типов в .NET, на каком бы языке вы ни писали программу, типы будут одинаковые, и они одинаково будут[6] храниться в памяти, а значит, станут одинаково интерпретироваться программой, и никаких проблем не возникнет.
В большинстве языков программирования выделяются два типа данных: простые (числа, строки, ... ) и сложные (структуры, объекты, ... ). В .NET и С# нет такого разделения. Эта технология полностью объектная, и даже простые типы данных являются объектами, хотя вы можете продолжать их использовать как простые типы в других языках. Это сделано для удобства программирования. [7]
Data types are sets (ranges) of values that have similar characteristics. For instance byte type specifies the set of integers in the range of [0 ... 255]. [8]
Каждая переменная имеет имя, тип, размер и значение. Имя переменной (идентификатор) в прямом смысле является ее названием. Тип определяет, какие числа или символы записаны в ячейку памяти под этим именем. Размер непосредственно связан с объявлением типа, определяет объем памяти и, следовательно, максимальную величину или точность задания числа. Значение определяет конкретное содержимое ячейки памяти. Идентификатор представляет собой комбинацию букв, цифр и знака подчеркивания, но не должен начинаться с цифры.
Например: Еr, rT_, yx, 6, u9t, _YU
Первым символом идентификатора может быть символ @, например:
@rt, @QQ, @D_eL
В этом случае за @ может следовать ключевое слово, например:
@new или @еlse
Венгерская нотация не привязана к конкретному языку программирования, но практически привязана к английскому языку. Если придерживаться принятых, хотя и не узаконенных правил, текст программы становится более понятным и удобным для работы. [9]
Наименование переменных - основа любой программы. От того, как будут выбираться имена, зависит читабельность кода приложения, а чем понятнее код, тем проще с ним работать/писать/сопровождать.
Пространство имен - это определенная область, внутри которой все имена должны быть уникальными. И именно благодаря использованию пространства имен уникальность переменных должна обеспечиваться только внутри определенного модуля - т.е. в разных модулях могут иметься переменные с одинаковыми именами. Так, например, в Delphi есть функция FindFirst. Такая же функция есть среди АРI-функций Windows, и описана она в модуле windows . Если нужно использовать вариант FindFirst из состава библиотеки визуальных компонентов (Visual Component Library, VCL), то можно просто вызвать эту функцию, а если нужен вариант из состава Windows API, то следует написать:
Windows.FindFirst
В .NET всё: классы, переменные, структуры и т. д. - разбито по пространствам имен, что позволяет избавиться от возможных конфликтов в именовании и, в то же время, использовать одинаковые имена в разных пространствах.[10]
Basic data types in C# are distributed into the following types:
Integer types - sbyte, byte, short, ushort, int, uint, long, ulong;
Real floating-point types - float, double;
Real type with decimal precision - decimal;
Boolean type - bool;
Character type - char;
String - string;
Object type - object.
These data types are called primitive (built-in types), because they are embedded in C# language at the lowest level. The table below represents the above[11] mentioned data types, their range and their default values: [12]
Таблица №1 - Основные типы данных CTS
Объект |
Псевдоним |
Описание |
Object |
object |
Базовый класс для всех типов CTS. |
String |
string |
Строка. |
SByte |
sbyte |
8 - разрядное число со знаком. Возможные значения от -128 до 127. |
Byte |
byte |
8 - разрядное число без знака. Значения от 0 до 255. |
Int16 |
int |
16 - разрядное число со знаком. Возможные значения от -32 768 до 32 767. |
Uint16 |
uint |
16 - разрядное число без знака. Возможные значения от 0 до 65 535. |
Int32 |
int |
32 - разрядное число со знаком. Возможные значения от -2 147 483 648 до 2 147 483 647. |
Uint32 |
uint |
32 - разрядное число без знака. Возможные значения от 0 до 4 294 967 295. |
Int64 |
long |
64 - разрядное число со знаком. Возможные значения от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. |
Uint64 |
ulong |
64 - разрядное число без знака. Значения от 0 до 18 446 744 073 709 551 615. |
Decimal |
decimal |
128 - разрядное число. |
Char |
char |
16 - разрядный символ. |
Single |
float |
32 - разрядное число с плавающей точкой стандарта IEEE. [13] |
Double |
double |
64 - разрядное число с плавающей точкой |
Boolean |
bool |
Булево значение[14] |
Вот небольшая программа, показывающая минимальное и максимальное значение каждого из типов данных:
Листинг 1. Минимальные и максимальные значения типов данных
using System;
namespace ConsoleApp6
{
class MinAndMax
{
static void Main(string[] args)
{
Console.WriteLine("sbyte: {0} to {1}", sbyte.MinValue, sbyte.MaxValue);
Console.WriteLine("byte: {0} to {1}", byte.MinValue, byte.MaxValue);
Console.WriteLine("short: {0} to {1}", short.MinValue, short.MaxValue);
Console.WriteLine("ushort: {0} to {1}", ushort.MinValue, ushort.MaxValue);
Console.WriteLine("int: {0} to {1}", int.MinValue, int.MaxValue);
Console.WriteLine("uint: {0} to {1}", uint.MinValue, uint.MaxValue);
Console.WriteLine("long: {0} to {1}", long.MinValue, long.MaxValue);
Console.WriteLine("float: {0} to {1}", float.MinValue, float.MaxValue);
Console.WriteLine("double: {0} to {1}", double.MinValue, double.MaxValue);
Console.WriteLine("decimal: {0} to {1}", decimal.MinValue, decimal.MaxValue); [15]
}
}
}[16]
Рисунок 2 - Результат исполнения программы из листинга 1
Наибольшее понимание любого вопроса дает конечно же практика, для этого заводим аккаунт и устанавливаем на ПК программу Visual Studio 2017 c официального сайта https://www.microsoft.com. Далее, перейдя «File - New – Projekt – ConsoleApp(.Net Core) – ОК», создаем новый проект консольной программы, вводим необходимые команды и переходим по «Debug – Start Without Debugging». Как результат – перед нами исполнение написанной программы в виде консольного окна. Стоит также заметить, что нам часто придется использовать встроенный метод Console.WriteLine.
Объявление переменных, синтаксис элементарных типов, безопасность типов
С# является жестко типизированным языком. При его использовании вы должны объявлять тип каждого объекта, который создаете (например, целые числа, числа с плавающей точкой, строки, окна, кнопки, и т. д.), и компилятор поможет вам избежать ошибок, связанных с присвоением переменным значений только того типа, который им соответствует. Тип объекта указывает компилятору размер объекта (например, объект типа int занимает в памяти 4 байта) и его свойства (например, форма может быть видима и невидима, и т.д.).[17]
Объявление переменных осуществляем следующим образом: первым делом указываем тип, следом - ее имя:
int z;
Вторым шагом нужно провести инициализацию, то есть присвоить значение до первого использования:
z=0;
Если использовать переменную до присваивания начального значения компилятор выдаст сообщение об ошибке.
При желании можно сократить запись в одну строку и указать даже несколько переменных:
int z=0; w=1;
Некоторые системные типы данных требуют особого пояснения. Первый из этих типов - System.Boo1ean. В отличие от С и C++ теперь присваивать переменным этого типа действительно можно только два значения - t r u e (истинно) и false (ложно). Если в С и C++ мы вполне могли присваивать