Конструкторы
Конструктор инициализирует объект при его создании. У конструктора такое же имя, как и у его класса, а с точки зрения синтаксиса он подобен методу. Но у конструкторов нет возвращаемого типа, указываемого явно. Ниже приведена общая форма конструктора:
доступ имя_класса(список_параметров) < // тело конструктора >
Как правило, конструктор используется для задания первоначальных значений переменных экземпляра, определенных в классе, или же для выполнения любых других установочных процедур, которые требуются для создания полностью сформированного объекта. Кроме того, доступ обычно представляет собой модификатор доступа типа public, поскольку конструкторы зачастую вызываются в классе. А список_параметров может быть как пустым, так и состоящим из одного или более указываемых параметров.
Каждый класс C# снабжается конструктором по умолчанию, который при необходимости может быть переопределен. По определению такой конструктор никогда не принимает аргументов. После размещения нового объекта в памяти конструктор по умолчанию гарантирует установку всех полей в соответствующие стандартные значения. Если вы не удовлетворены такими присваиваниями по умолчанию, можете переопределить конструктор по умолчанию в соответствии со своими нуждами.
Конструктор также может принимать один или несколько параметров. В конструктор параметры вводятся таким же образом, как и в метод. Для этого достаточно объявить их в скобках после имени конструктора.
Давайте рассмотрим применение конструкторов на примере:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class MyClass < public string Name; public byte Age; // Создаем параметрический конструктор public MyClass(string s, byte b) < Name = s; Age = b; >public void reWrite() < Console.WriteLine("Имя: \nВозраст: ", Name, Age); > > class Program < static void Main(string[] args) < MyClass ex = new MyClass("Alexandr", 26); ex.reWrite(); Console.ReadLine(); >> >
Как видите, в данном примере поля экземпляра класса ex инициализируются по умолчанию с помощью конструктора.
Конструкторы и Деструкторы в C#: Простое объяснение с примерами
В программировании на C# конструкторы и деструкторы играют важную роль в жизненном цикле объекта. Давайте подробно и простыми словами разберём, что они собой представляют и как используются.
Содержание показать
Что такое Конструктор?
Конструктор — это специальный метод класса, который автоматически вызывается при создании нового объекта этого класса. Основная задача конструктора — инициализировать объект, то есть задать начальные значения его свойствам.
Синтаксис Конструктора
public class MyClass < public MyClass() < // Код инициализации > >
Здесь MyClass() является конструктором класса MyClass . Он не имеет возвращаемого типа и его название всегда совпадает с названием класса.
Пример Конструктора
public class Person < public string Name; public int Age; // Конструктор public Person(string name, int age) < Name = name; Age = age; >>
В этом примере конструктор Person инициализирует объект с заданным именем и возрастом.
Конструкторы с Параметрами
Конструкторы могут иметь параметры, что позволяет передавать значения для инициализации объекта.
Пример
Person person = new Person("Анна", 30);
Что такое Деструктор?
Деструктор — это метод, который вызывается автоматически при уничтожении объекта. В C# сборщик мусора управляет выделением и освобождением памяти, поэтому деструкторы не так важны, как в некоторых других языках, и используются реже.
Синтаксис Деструктора
public class MyClass < ~MyClass() < // Код очистки > >
Деструктор ~MyClass() вызывается при уничтожении объекта MyClass .
Пример Деструктора
public class FileHandler < private FileStream fileStream; public FileHandler(string fileName) < fileStream = new FileStream(fileName, FileMode.OpenOrCreate); > ~FileHandler() < fileStream?.Close(); // Закрытие файла при уничтожении объекта > >
В этом примере деструктор закрывает файловый поток, когда объект FileHandler уничтожается. Однако, на практике лучше использовать конструкцию using для автоматического закрытия файловых потоков и других ресурсов.
Читайте так же Нахождение Факториала в C#: Простое Руководство
Важные Моменты
- Конструкторы и деструкторы не наследуются.
- В одном классе может быть несколько конструкторов, но только один деструктор.
- Деструкторы в C# вызываются не моментально, а когда сборщик мусора решает очистить объект. Поэтому их использование не гарантирует мгновенное освобождение ресурсов.
C#. Инициализация данных в классе. Конструктор класса. Конструктор по умолчанию
Инициализация данных в классе. Конструктор класса. Конструктор по умолчанию
Поиск на других ресурсах:
1. Что такое конструкторы? Какие отличия между методами класса и конструкторами?
С точки зрения синтаксиса, конструктор подобен методу. Конструктор осуществляет инициализацию объекта класса при его создании. Конструктор имеет такое же имя как и класс. Конструктор не имеет возвращаемого типа, который указывается явным образом.
Как правило, конструктор применяется для:
- задания начальных значений переменным экземпляра класса;
- выполнения некоторых начальных операций, которые нужны для создания полностью сформированного объекта.
⇑
2. Какая общая форма конструктора?
Ниже приведена общая форма конструктора:
доступ имя_класса(параметры) < // тело конструктора >
- доступ – модификатор доступа. Чаще всего это модификатор доступа public . Если конструктор вызывается из-за границ класса, то он обязательно должен иметь доступ public .
- параметры – список параметров, которые получает конструктор. Список параметров может быть пустым.
Пример объявления конструктора для класса MyPoint . В данном конструкторе получается два параметра с именами newx , newy . Эти параметры инициализируют внутренние переменные класса x и y .
. public MyPoint(int newx, int newy) < x = newx; y = newy; >. // использование описанного конструктора при создании экземпляра класса MyPoint p = new MyPoint(5,8);
⇑
3. Сколько конструкторов может иметь класс?
Класс может иметь любое число конструкторов, которые должны отличаться один от другого числом параметров и/или типами параметров.
⇑
4. Что такое конструктор по умолчанию?
Если не определить конструктор в классе, язык C# автоматически создаст конструктор по умолчанию. Этот конструктор инициализирует все переменные экземпляра класса их значениями по умолчанию.
Для большинства типов данных значение по умолчанию есть нулевым, для типа bool – false , для ссылочных типов – пустое значение.
Пример. Пусть задан класс MyBook , содержащий только данные. В классе нет ни одного описанного конструктора. Все равно, при создании экземпляра класса (оператор new ), будет вызван конструктор по умолчанию.
. class MyBook < private string Title; private string Author; private int year; private float price; > . // использование класса в программе // вызовется конструктор по умолчанию MyBook(), который явно не описан в классе MyBook mb1 = new MyBook(); .
⇑
5. Пример инициализации класса с помощью конструкторов.
Пусть дано описание класса типа MyBook . В классе MyBook описываются два конструктора. Один конструктор без параметров. Другой конструктор получает четыре параметра, которые заполняют соответствующие внутренние поля класса MyBook .
. class MyBook < // поля класса - объявлены как скрытые (private) private string Title; private string Author; private int year; private float price; // конструктор класса без параметров public MyBook() < Title = ""; Author = ""; year = 1900; price = 0.00f; > // конструктор класса с четырмя параметрами public MyBook(string t, string a, int y, float p) < Title = t; Author = a; year = y; price = p; >> . // использование конструкторов при инициализации данных (полей) класса MyBook mb1 = new MyBook(); MyBook mb2 = new MyBook("Title-1", "Author-1", 2000, 3.99f);
⇑
6. Какие конструкторы называются параметризированными?
Параметризированные конструкторы – это конструкторы, которые принимают один и больше параметров.
⇑
7. Перегрузка конструкторов. Каким образом осуществляется перегрузка конструкторов? Пример
Конструктор, как и любой метод, может быть «перегруженным». То есть, в классе может быть несколько конструкторов, которые отличаются между собой типами и (или) количеством параметров.
Пример. Объявляется класс Time , который реализует время: часы, минуты, секунды. В классе реализуется 4 конструктора с разным количеством параметров. Исходный код класса следующий:
// класс, описывающий время class Time < int hour; // часы int min; // минуты int sec; // секунды // конструктор без параметров public Time() < hour = min = sec = 0; >// конструктор с одним параметром - устанавливает только часы public Time(int hour) < this.hour = hour; min = sec = 0; > // конструктор с двумя параметрами - устанавливает часы, минуты public Time(int hour, int min) < this.hour = hour; this.min = min; sec = 0; > // конструктор с тремя параметрами - устанавливает часы, минуты, секунды public Time(int hour, int min, int sec) < this.hour = hour; this.min = min; this.sec = sec; > // методы доступа public int GetHour() < return hour; > public int GetMin() < return min; > public int GetSec() < return sec; > >
Использование класса Time в другом методе (программном коде):
// использование класса Time Time t0 = new Time(); // вызов конструктора без параметров 00:00:00 Time t1 = new Time(8); // вызов конструктора с 1 параметром 08:00:00 Time t2 = new Time(5, 23); // вызов конструктора с 2 параметрами 05:23:00 Time t3; // только объявление ссылки на класс типа Time t3 = new Time(10, 20, 45); // создание объекта, вызов конструктора с 3 параметрами 10:20:45 // проверка int h, m, s; h = t0.GetHour(); // h = 0 m = t0.GetMin(); // m = 0 h = t1.GetHour(); // h = 8 h = t2.GetHour(); // h = 5 m = t2.GetMin(); // m = 23 s = t2.GetSec(); // s = 0 h = t3.GetHour(); // h = 10 m = t3.GetMin(); // m = 20 s = t3.GetSec(); // s = 45
⇑
8. Можно ли из одного конструктора вызвать другой конструктор?
Да можно. Это осуществляется с помощью ключевого слова this . Ключевое слово this есть ссылкой на текущий класс. То есть, this есть именем текущего класса, а значит, может использоваться как конструктор.
⇑
9. Каким образом можно вызывать один конструктор из другого? Общая форма
Общая форма вызова из одного конструктора другого в классе, который носит имя ClassName :
class ClassName < // это конструктор ClassName(parameters_list1) : this(parameters_list2) < // тело конструктора ClassName > >
В этом случае сначала выполняется конструктор
this(parameters_list2)
а затем выполняется конструктор
ClassName(parameters_list1)
Тело конструктора ClassName может быть пустой.
⇑
10. Пример вызова одного конструктора из другого
В примере реализуется класс Time , который описывает время. В классе есть несколько конструкторов. Каждый из них инициализируется по разному.
Листинг класса следующий
// класс, который описывает время class Time < int hour; // часы int min; // минуты int sec; // секунды // конструктор без параметров - инициализируется с помощью конструктора с 3 параметрами public Time() : this(0, 0, 0) < // тело конструктора отсутствует > // конструктор с одним параметром - устанавливает только часы public Time(int hour) : this(hour, 0, 0) < >// конструктор с двумя параметрами - устанавливает часы, минуты public Time(int hour, int min) : this(hour, min, 0) < > // конструктор с тремя параметрами - устанавливает часы, минуты, секунды public Time(int hour, int min, int sec) < this.hour = hour; this.min = min; this.sec = sec; > // конструктор, который получает параметром ссылку на объект public Time(Time t) : this(t.GetHour(), t.GetMin(), t.GetSec()) < > // методы доступа public int GetHour() < return hour; > public int GetMin() < return min; > public int GetSec() < return sec; > >
Использование класса в другом программном коде (методе)
// использование класса Time Time t0 = new Time(); // вызов конструктора без параметров 00:00:00 Time t1 = new Time(8); // вызов конструктора с 1 параметром 08:00:00 Time t2 = new Time(7, 17); // вызов конструктора с 2 параметрами 07:17:00 Time t3; // только объявление ссылки на класс типа Time t3 = new Time(7, 10, 15); // создание объекта, вызов конструктора с 3 параметрами 7:10:15 Time t4 = new Time(t3); // вызов конструктора, который принимает параметром объект класса // проверка int h, m, s; h = t0.GetHour(); // h = 0 m = t0.GetMin(); // m = 0 h = t1.GetHour(); // h = 8 h = t2.GetHour(); // h = 7 m = t2.GetMin(); // m = 17 s = t2.GetSec(); // s = 0 h = t3.GetHour(); // h = 7 m = t3.GetMin(); // m = 10 s = t3.GetSec(); // s = 15 h = t4.GetHour(); // h = 7 m = t4.GetMin(); // m = 10 s = t4.GetSec(); // s = 15
⇑
Связанные темы
- Понятие класса. Общая форма объявления класса. Объект класса. Поля класса. Примеры.Ключевое слово this . Вложенные классы
- Деструктор. «Сборка мусора»
- Динамическое выделение памяти. Оператор new . Выделение памяти для типов-значений, структур, перечислений, объектов классов. Выделение памяти для массивов
Что такое конструктор в C#
Конструктор — это специальный метод, который используется для инициализации объекта. Каждый класс имеет конструктор, если мы явно не объявляем конструктор для любого класса C#, компилятор строит конструктор по умолчанию для этого класса. Конструктор не имеет никакого типа возврата. Конструкторы отвечают за инициализацию объекта и выделение памяти его класса.
Конструктор C# вызывается во время создания объекта. Он создает значения, т.е. предоставляет данные для объекта, поэтому он известен как конструктор.
Правила создания конструктора
Существуют два правила, определенные для конструктора.
- Имя конструктора должно совпадать с именем класса
- Конструктор не должен иметь явного типа возврата
Тип конструкторов:
Существует два типа конструкторов:
- Конструктор по умолчанию (конструктор no-arg)
- Параметрированный конструктор
Конструктор по умолчанию C#
Конструктор, который не имеет параметра, известен как конструктор по умолчанию.
using System; Class Student < int roll; float marks; public Student() //constructor < roll=0; marks=0.0; >// other members >
Вышеупомянутый конструктор Student () не принимает никаких аргументов, поэтому он является примером конструктора default / non-parameterized.
С помощью этого типа конструктора объект будет создан следующим образом:
Student obj1 = new Student();
Параметрированный конструктор в C#
Class Student < int roll; float marks; public Student(int a, float b)//constructor < roll = a; marks = b; >//other members >
Вышеуказанный конструктор принимает два аргумента один int и другой float для инициализации роли экземпляров экземпляров и меток для вновь созданного объекта, и поэтому он называется параметризованным конструктором. С помощью этого типа конструктора объект будет создан следующим образом:
Student obj = new Student( 17 , 58.08F);
Перегрузка конструктора
Подобно методам, конструктор также может быть перегружен. Перегруженные конструкторы дифференцируются по их типу параметров или количеству параметров. Перегрузка конструктора не сильно отличается от перегрузки метода. В случае перегрузки метода у вас есть несколько методов с одним и тем же именем, но с другой подписью, тогда как при перегрузке конструктора у вас есть несколько конструкторов с различной подписью, но разница только в том, что у конструктора нет типа возврата на C#.
using System; public Class OverloadStudent < public OverloadStudent () < //Конструктор по умолчанию >public OverloadStudent (int age) < //Конструктор одиночных параметров >public OverloadStudent (int age, string name) < //два конструктора параметров >>
Теперь следуем способы, с помощью которых мы можем создать экземпляр объекта.
OverloadStudent obj=new OverloadStudent() ; OverloadStudent obj=new OverloadStudent(43) ; OverloadStudent obj=new OverloadStudent(47,"Steve") ;
Статический конструктор:
Статический конструктор — это специальный конструктор, который вызывается до создания первого объекта класса. Он используется для инициализации любых статических данных или для выполнения определенного действия, которое необходимо выполнить только один раз.
Время выполнения статического конструктора неизвестно, но это определенно до создания первого объекта — может быть во время загрузки сборки.
// Example1 using System; public Class Student < static Student() < // инициализировать только статические элементы. >// другие методы здесь. > // Example2 using System; public class MyStaticClass < static int count; static MyStaticClass() < count = 0; Console.WriteLine("Static class is initialized"); >public static void MyMethod(string name) < Console.WriteLine("Static class is initialized " + name); >> MyStaticClass.MyMethod("Steve") ; //method call //конструктор будет вызван автоматически Output: Static class is initialized Hello Steve
Правила для статического конструктора:
- Класс может иметь только один статический конструктор
- Статический конструктор не может иметь никакого параметра
- У статического конструктора не может быть спецификатора доступа
- Он используется для инициализации статических элементов данных класса
- для любого количества создания объекта статический конструктор запускается только один раз
- Статический конструктор запускается при использовании класса
- Программист не может вызывать статический конструктор
У нас может быть 2 конструктора.
using System; public Class question < static Students() < //initialize static member only. >public Students() < // коды для первого конструктора класса получения. >>
Частный конструктор:
Частный конструктор — это специальный конструктор экземпляров, который используется в классе, который содержит только статический член.
Если у класса есть один или несколько частных конструкторов и нет общего конструктора, тогда другим классам не разрешается создавать экземпляр этого класса.
using System; public Class Student < private Student() < Console.WriteLine("Это не частный конструктор параметров"); >public Student(int a):this() < Console.WriteLine("Это один параметр public constructor"); >>
Объект класса может быть создан как:
Student obj = new Student(20) ;
Но определение такого объекта не будет работать.
Student obj = new Student() ;
Правила для частного конструктора:
- одно использование частного конструктора — это когда у нас есть только статический член.
- Он обеспечивает реализацию шаблона одноэлементного класса
- Когда мы предоставим конструктор (private / public / any), компилятор не добавит конструктор public без параметров в любой класс.