
- •Создание консольного проекта про c#
- •Выполнение проекта по умолчанию после "большого взрыва"
- •Проект WindowsHello
- •Структура класса c#
- •Создание объектов и их инициализация
- •Вынесение класса с точкой входа в отдельный файл
- •Инициализация членов без конструктора
- •Типы данных в c#
- •Общие сравнения структурных и ссылочных типов
- •Базовый тип System.Object
- •Перегрузка стандартных методов класса System.Object
- •Перегрузка (замещение) виртуального метода ToString()
- •Статические методы класса System.Object
- •Системные типы данных и их псевдонимы как встроенные типы c#
Создание объектов и их инициализация
Все объекты в C# создаются на куче и с помощью оператора new. Инициализация объектов при их создании выполняется функциями-членами класса, которые называются конструкторами. Конструкторы не нужно вызывать специально. Они вызываются автоматически при создании объекта и только один раз. Повторно вызвать конструктор как метод для уже существующего объекта невозможно.
Различают конструкторы по умолчанию и общие конструкторы. Конструктор по умолчанию не имеет аргументов. Программист может его определить сам или ситема предоставит его автоматически, если программистом не был объявлен ни один конструктор. Конструктор по умолчанию может быть у класса только один. Общие конструкторы имеют аргументы. Класс может иметь несколько общих конструкторов, только они должны различаться сигнатурой (количеством, типом и порядком следования аргументов), чтобы компилятор мог однозначно определить перегружаемый конструктор по сигнатуре в фактическом вызове.
Язык C# имеет существенное отличие от C++ в отношении конструктора по умолчанию. В C++ если программист не предусмотрел свой конструктор по умолчанию, то предоставляемый системой конструктор ничего с данными-членами класса не делает и они остаются неинициализированными. В C# конструктор по умолчанию, предоставляемый системой, производит инициализацию данных, большей частью нулем. Но если программист определил хоть один конструктор с параметрами, то конструктор по умолчанию системой уже не предоставляется и нужно определить свой конструктор по умолчанию, хоть с пустым телом.
Имена конструкторов должны совпадать с именем класса. Конструкторы должны иметь модификатор доступа public.
Для иллюстрации сказанного продолжим модификацию нашего проекта консольного приложения ConsoleApplication1 в части объявления класса HelloClass.
Модифицируйте класс следующим образом
using System;
namespace ConsoleApp
{
class HelloClass
{
// Внутренние переменные
private int x, y;
// Конструкторы
public HelloClass() // Конструктор по умолчанию
{
Console.WriteLine("Конструктор по умолчанию");
}
public HelloClass(int a, int b) // Конструктор с параметрами
{
Console.WriteLine("Конструктор с параметрами");
x = a;
y = b;
}
// Сервисы класса
public int GetX(){return x;}
public int GetY(){return y;}
// Точка входа в программу
static void Main(string[] args)
{
// Создаем два объекта-экземпляра класса
HelloClass ob1 = new HelloClass(); // Вызов конструктора по умолчанию
Console.WriteLine("ob1: x = {0};
y = {1} \n", ob1.GetX(), ob1.GetY());
HelloClass ob2 = new HelloClass(10, 15); // Вызов общего конструктора
Console.WriteLine("ob2: x = {0};
y = {1}", ob2.GetX(), ob2.GetY());
while(true);
}
}
}
Листинг 6 . Введение конструкторов в класс HelloClass
Постройте и запустите проект через кнопку Start оболочки, получим результат
Результат применения конструкторов
Конструктор по умолчанию
ob1: x = 0; y = 0
Конструктор с параметрами
ob2: x = 10; y = 15
Мы видим, что переменные x и y в первом объекте не остались брошенными, как это бы было в C++, а инициализировались нулями в соответствии с их типом.
Деструкторы в C# применять не нужно, поэтому они не предусмотрены синтаксисом и в C# даже нет зарезервированного слова delete. Программист не должен заботиться об освобождении затребованной у системы памяти на куче. Об этом позаботится специальный механизм, который называется сборщиком мусора ( GC - Garbare Collector ). Сборщик мусора платформы . NET освободит память автоматически.
Вынесение точки входа в самостоятельный класс
В последнем примере мы внутри класса HelloClass в методе Main() создавали объекты того же самого класса. Это вносит лишнюю путаницу в изучение кода. Функция Main() никакого отношения к классу HelloClass не имеет и присутствует там только из-за того, что глобальные функции в C# недопустимы и ее нужно куда-то приткнуть. Так давайте же вынесем ее в отдельный класс, чтобы отделить "котлеты от мух".
Измените код файла HelloClass.cs так, как показано ниже
using System;
namespace ConsoleApp
{
class HelloClass
{
// Внутренние переменные
private int x, y;
// Конструкторы
public HelloClass() // Конструктор по умолчанию
{
Console.WriteLine("Конструктор по умолчанию");
}
public HelloClass(int a, int b) // Конструктор с параметрами
{
Console.WriteLine("Конструктор с параметрами");
x = a;
y = b;
}
// Сервисы класса
public int GetX(){return x;}
public int GetY(){return y;}
}
//**************************************************************
class HelloApp
{
// Точка входа в программу
static void Main(string[] args)
{
// Создаем два объекта-экземпляра класса
HelloClass ob1 = new HelloClass(); // Вызов конструктора по умолчанию
Console.WriteLine("ob1: x = {0};
y = {1} \n", ob1.GetX(), ob1.GetY());
HelloClass ob2 = new HelloClass(10, 15); // Вызов общего конструктора
Console.WriteLine("ob2: x = {0};
y = {1}", ob2.GetX(), ob2.GetY());
while(true);
}
}
}
Листинг 7 . Выделение точки входа в отдельный класс
Здесь мы ничего кардинального на сделали, просто объявили новый класс и в его тело вынесли функцию Main().
Запустите приложение и получите тот же самый результат
Тот же результат после вынесения точки входа в самостоятельный класс
Конструктор по умолчанию
ob1: x = 0; y = 0
Конструктор с параметрами
ob2: x = 10; y = 15
Поменяйте местами порядок следования классов и опять постройте приложение. Ничего не изменилось. Но в C++ пришлось бы в этом случае применять упреждающее объявление класса HelloClass перед классом HelloApp, поскольку его однопроходный компилятор встретив использование класса HelloClass еще не дошел бы до объявления самого класса HelloClass.