Если говорить в общем, то при изучении языков C, C++ и C# вы заметите следующую особенность:
- Программа на C — это набор функций и типов данных
- Программа на C++ — это набор функций и классов
- Суть же программы на C# заключается в наборе объявлений типов
Исходный код любого исполняемого файла C# (EXE) или динамической библиотеки (DLL) состоит из одного или нескольких объявлений типов.
У DLL отсутствует точка входа Main, а в исполняемом файле (EXE) обязательно нужно объявить как минимум один класс с методом Main — точкой запуска программы.
Крупное программное обеспечение содержит в исходном коде тысячи разных типов (классов и т.д.). Над большими проектами работает несколько программистов, каждый отвечает за свой модуль, поэтому неизбежно возникают одинаковые имена типов. Как избежать конфликтов имен? Для этого и нужны «пространства имен», о которых мы говорили ранее.
Пространство имен (namespace) предназначено для группировки связанных объявлений типов и присвоения единого названия этой группе. Поскольку сама программа является набором взаимосвязанных объявлений типов, разработчики обычно создают собственные пространства имен и помещают в них все типы проекта.
Проще говоря, пространство имен добавляет групповое название набору классов. Чтобы обратиться к этим классам из другого места, нужно указывать данное групповое название.
Представьте класс, где есть два ученика с одинаковым именем и фамилией — учителя и одноклассники не смогут различить их только по имени. Чтобы отделить их, используют дополнительные пометки, например Том из группы А и Том из группы Б. Эти пометки А и Б выполняют роль пространств имен.
Приведенный ниже код демонстрирует программу с тремя объявлениями типов, все типы определены внутри пространства имен с названием MyProgram.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloDemo // Объявление пространства имен
{
class A // Объявление типа A (класс)
{
void Fun1() // Функция
{
// Логика программы
}
}
class B // Объявление типа B (класс)
{
void Fun1() // Функция
{
// Логика программы
}
}
class C // Объявление типа C (класс)
{
static void Main(string[] args) // Точка входа Main
{
double pi = 3.14;
string webSite = "foxdevelop.com";
Console.WriteLine($"The Pi is {pi} and the website is {webSite}.");
}
}
}
Code language: PHP (php)
Мы подробно разберем пространства имен в следующих уроках.
Тип — это шаблон
Поскольку программа на C# по сути является набором объявлений типов, основа изучения C# — это освоить создание и использование типов. Сначала нужно понять:
Что такое тип (Type)
Тип можно воспринимать как шаблон для создания структур данных: сам он не является готовой структурой данных, но определяет все характеристики объектов, создаваемых по этому шаблону.
Тип — это лишь чертеж, он сам не занимает память; память выделяется и данные сохраняются только после инстанцирования.
Тип — это чертеж, по которому создаются реальные объекты. Это похоже на чертеж дома: по одному чертежу можно построить множество отдельных домов.
Каждый тип определяется тремя составляющими:
- Имя
- Структура для хранения данных членов
- Поведение и ограничения
В C# всё является типом, включая встроенные базовые типы.
Ниже два стандартных встроенных типа: short и int.
Их структура выглядит так:
| Тип short | Тип int |
|---|---|
| Имя: short | Имя: int |
| Структура: занимает 2 байта | Структура: занимает 4 байта |
| Поведение: 16-битное целое число | Поведение: 32-битное целое число |
- Имя: идентификатор типа (
int/string/название пользовательского класса) - Структура хранения: задает объем занимаемой памяти и расположение полей (например,
shortвсегда занимает 2 байта) - Ограничения поведения: определяет допустимые операции, диапазон значений и встроенные методы (например, для
intдоступны арифметические операции, диапазон значений-2^31 ~ 2^31-1)
Инстанцирование (Instantiate)
Создание реального рабочего объекта данных по шаблону типа с помощью ключевого слова new
Объект (object) = Экземпляр (instance)
Возьмем те же типы int и short: по ним можно создавать экземпляры. В примере ниже переменные pi, age, nums — это экземпляры, созданные по типам double, int и short соответственно.
namespace HelloDemo
{
class Program
{
static void Main(string[] args)
{
double pi = 3.14;
int age = 12;
short nums = 23;
}
}
}Code language: JavaScript (javascript)
В C# абсолютно все переменные и данные программы — это экземпляры какого-либо типа, данных без типа не существует.
Смотрите предыдущий пример кода
Класс C из примера является точкой входа программы и удовлетворяет требованиям для исполняемого файла:
- Это пользовательский тип внутри пространства имен
MyProgram - Содержит статический метод
Mainбез возвращаемого значения — точку запуска приложения
В C# есть не только тип class
Все объявляемые типы C#: класс (class), структура (struct), интерфейс (interface), перечисление (enum), делегат (delegate), запись (record)
BCL (Base Class Library — Базовая библиотека классов): стандартная встроенная библиотека .NET, содержит предопределенные системные типы int, short, string, List<T> и другие, которые разработчик может сразу инстанцировать и использовать.
Объявление типа