Constructor class c sharp

Общие сведения о классах

Тип, определенный как , class является ссылочным типом. Во время выполнения при объявлении переменной ссылочного типа переменная содержит значение null , пока вы явно не создадите экземпляр класса с помощью new оператора или не назначите ему объект совместимого типа, который может быть создан в другом месте, как показано в следующем примере:

//Declaring an object of type MyClass. MyClass mc = new MyClass(); //Declaring another object of the same type, assigning it the value of the first object. MyClass mc2 = mc; 

При создании объекта выделяется достаточный объем памяти для этого объекта в управляемой куче, и переменная хранит только ссылку на расположение данного объекта. Память, используемая объектом, освобождается с помощью функции автоматического управления памятью среды CLR, которая называется сборкой мусора. Дополнительные сведения о сборке мусора см. в разделе Автоматическое управление памятью и сборка мусора.

Объявление классов

Классы объявляются с помощью class ключевое слово за которым следует уникальный идентификатор, как показано в следующем примере:

//[access modifier] - [class] - [identifier] public class Customer < // Fields, properties, methods and events go here. >

Дополнительный модификатор class доступа предшествует ключевое слово. Так как public используется в этом случае, любой пользователь может создавать экземпляры этого класса. За именем класса следует ключевое слово class . Имя класса должно быть допустимым именем идентификатора C#. Оставшаяся часть определения — это тело класса, в котором задаются данные и поведение. Поля, свойства, методы и события в классе собирательно называются членами класса.

Создание объектов

Хотя они иногда используются взаимозаменяемо, класс и объект — это разные вещи. Класс определяет тип объекта, но сам по себе он не является объектом. Объект — это конкретная сущность, основанная на классе, которую иногда называют экземпляром класса.

Читайте также:  Вывод суммы массива python

Объекты можно создать с помощью new ключевое слово за которым следует имя класса, как показано ниже:

Customer object1 = new Customer(); 

При создании экземпляра класса ссылка на объект передается программисту. В предыдущем примере object1 представляет собой ссылку на объект, который основан на Customer . Эта ссылка ссылается на новый объект , но не содержит сами данные объекта. Фактически, можно создать ссылку на объект без создания собственно объекта:

Не рекомендуется создавать ссылки на объекты, которые не ссылаются на объект, так как попытка получить доступ к объекту через такую ссылку завершается сбоем во время выполнения. Ссылку можно сделать для ссылки на объект, создав новый объект или назначив ему существующий объект, например:

Customer object3 = new Customer(); Customer object4 = object3; 

В этом коде создаются две ссылки на объект, которые указывают на один и тот же объект. Таким образом, любые изменения объекта, выполненные посредством object3 , отражаются при последующем использовании object4 . Поскольку на объекты, основанные на классах, указывают ссылки, классы называют ссылочными типами.

Конструкторы и инициализация

В предыдущих разделах представлен синтаксис для объявления типа класса и создания экземпляра этого типа. При создании экземпляра типа необходимо убедиться, что его поля и свойства инициализированы полезными значениями. Существует несколько способов инициализации значений.

  • Принятие значений по умолчанию
  • Инициализаторы полей
  • Параметры конструктора
  • Инициализаторы объектов

Каждый тип .NET имеет значение по умолчанию. Как правило, это значение равно 0 для числовых типов и null для всех ссылочных типов. Вы можете использовать это значение по умолчанию, если это целесообразно в приложении.

Если значение по умолчанию .NET не является правильным, можно задать начальное значение с помощью инициализатора поля:

Вы можете потребовать, чтобы вызывающие стороны предоставляли начальное значение, определив конструктор , который отвечает за установку этого начального значения:

public class Container < private int _capacity; public Container(int capacity) =>_capacity = capacity; > 

Начиная с C# 12, можно определить основной конструктор как часть объявления класса:

public class Container(int capacity)

Добавление параметров в имя класса определяет основной конструктор. Эти параметры доступны в теле класса, который включает его члены. Их можно использовать для инициализации полей или в любом другом месте, где они необходимы.

Вы также можете использовать модификатор required для свойства и разрешить вызывающим объектам использовать инициализатор объекта для задания начального значения свойства:

public class Person < public required string LastName < get; set; >public required string FirstName < get; set; >> 

Добавление required ключевое слово требует, чтобы вызывающие объекты должны задавать эти свойства как часть new выражения:

var p1 = new Person(); // Error! Required properties not set var p2 = new Person() < FirstName = "Grace", LastName = "Hopper" >; 

Наследование классов

Классы полностью поддерживают наследование, фундаментальный механизм объектно ориентированного программирования. При создании класса можно наследовать от любого другого класса, который не определен как sealed . Другие классы могут наследовать от класса и переопределять виртуальные методы класса. Кроме того, можно реализовать один или несколько интерфейсов.

При наследовании создается производный класс, то есть класс объявляется с помощью базового класса, от которого он наследует данные и поведение. Базовый класс задается добавлением после имени производного класса двоеточия и имени базового класса, как показано далее:

public class Manager : Employee < // Employee fields, properties, methods and events are inherited // New Manager fields, properties, methods and events go here. >

Когда объявление класса включает базовый класс, оно наследует все члены базового класса, кроме конструкторов. Дополнительные сведения см. в разделе Наследование.

Класс в C# может напрямую наследовать только от одного базового класса. Однако поскольку базовый класс может сам наследовать от другого класса, класс может косвенно наследовать несколько базовых классов. Кроме того, класс может напрямую реализовать несколько интерфейсов. Дополнительные сведения см. в разделе Интерфейсы.

Класс можно объявить как abstract . Абстрактный класс содержит абстрактные методы, которые имеют определение сигнатуры, но не имеют реализации. Не удается создать экземпляр абстрактных классов. Они могут использоваться только через производные классы, реализующие абстрактные методы. В отличие от этого, запечатанный класс не позволяет другим классам наследоваться от него. Дополнительные сведения см. в статье Абстрактные и запечатанные классы и члены классов.

Определения классов можно разделить между различными исходными файлами. Дополнительные сведения см. в разделе Разделяемые классы и методы.

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

Источник

Использование конструкторов (Руководство по программированию на C#)

При создании экземпляра класса или структуры вызывается его конструктор. Конструкторы имеют имя, совпадающее с именем класса или структуры, и обычно инициализируют члены данных нового объекта.

В следующем примере класс с именем Taxi определяется с помощью простого конструктора. Затем оператор new создает экземпляр этого класса. Конструктор Taxi вызывается оператором new сразу после того, как новому объекту будет выделена память.

public class Taxi < public bool IsInitialized; public Taxi() < IsInitialized = true; >> class TestTaxi < static void Main() < Taxi t = new Taxi(); Console.WriteLine(t.IsInitialized); >> 

Конструктор, который не принимает никаких параметров, называется конструктором без параметров. Конструкторы без параметров вызываются всякий раз, когда создается экземпляр объекта с помощью оператора new , а аргументы в new не передаются. В C# 12 представлены основные конструкторы. Основной конструктор задает параметры, которые необходимо предоставить для инициализации нового объекта. Дополнительные сведения см. в разделе Конструкторы экземпляров.

Если класс не является статическим, компилятор C# выделяет классам без конструкторов открытый конструктор без параметров, позволяющий создавать экземпляры классов. Дополнительные сведения см. в статье Статические классы и члены статических классов.

Создание экземпляров класса можно запретить, сделав конструктор закрытым, следующим образом:

class NLog < // Private Constructor: private NLog() < >public static double e = Math.E; //2.71828. > 

Дополнительные сведения см. в разделе Закрытые конструкторы.

Конструкторы для типов структур похожи на конструкторы классов. При создании экземпляра типа структуры с new помощью вызывается конструктор . Если для struct задано значение default , среда выполнения инициализирует всю память в структуре равным 0. До C# 10 не может содержать явный конструктор без параметров, structs так как он предоставляется компилятором автоматически. Дополнительные сведения см. в разделе инициализация структуры и значения по умолчанию статьи Типы структур .

В следующем коде используется конструктор без параметров для Int32, чтобы вы были уверены, что целое число инициализировано:

int i = new int(); Console.WriteLine(i); 

Однако следующий код вызывает ошибку компилятора, так как он не использует new и пытается использовать объект, который не был инициализирован:

Кроме того, объекты на основе structs (включая все встроенные числовые типы) можно инициализировать или назначить, а затем использовать, как в следующем примере:

int a = 44; // Initialize the value type. int b; b = 33; // Or assign it before using it. Console.WriteLine(", ", a, b); 

Как классы, так и структуры могут определять конструкторы, которые принимают параметры, включая первичные конструкторы. Конструкторы, принимающие параметры, необходимо вызывать с помощью оператора new или base. Классы и структуры также могут определять несколько конструкторов, и ни то, ни другое не требуется для определения конструктора без параметров. Пример:

public class Employee < public int Salary; public Employee() < >public Employee(int annualSalary) < Salary = annualSalary; >public Employee(int weeklySalary, int numberOfWeeks) < Salary = weeklySalary * numberOfWeeks; >> 

Этот класс можно создать, воспользовавшись одним из следующих операторов:

Employee e1 = new Employee(30000); Employee e2 = new Employee(500, 52); 

Конструктор может использовать ключевое слово base для вызова конструктора базового класса. Пример:

public class Manager : Employee < public Manager(int annualSalary) : base(annualSalary) < //Add further instructions here. >> 

В этом примере конструктор базового класса вызывается перед выполнением соответствующего ему блока. Ключевое слово base можно использовать как с параметрами, так и без них. Любые параметры для конструктора можно использовать как параметры для base или как часть выражения. Дополнительные сведения см. в разделе base.

В производном классе, если конструктор базового класса не вызывается явным образом с помощью base ключевое слово, конструктор без параметров, если он есть, вызывается неявно. Следующие объявления конструктора фактически одинаковы:

public Manager(int initialData) < //Add further instructions here. >
public Manager(int initialData) : base() < //Add further instructions here. >

Если базовый класс не предлагает конструктор без параметров, производный класс должен выполнить явный вызов базового конструктора с помощью base .

Конструктор может вызывать другой конструктор в том же объекте с помощью ключевого слова this. Как и base , this можно использовать с параметрами или без, а все параметры в конструкторе доступны как параметры this или как часть выражения. Например, второй конструктор в предыдущем примере можно переписать, используя this :

public Employee(int weeklySalary, int numberOfWeeks) : this(weeklySalary * numberOfWeeks)

Применение ключевого слова this в приведенном выше примере привело к вызову конструктора:

public Employee(int annualSalary)

Конструкторы могут иметь пометку public, private, protected, internal, protected internal или private protected. Эти модификаторы доступа определяют, каким образом пользователи класса смогут создавать класс. Дополнительные сведения см. в статье Модификаторы доступа.

Конструктор можно объявить статическим, используя ключевое слово static. Статические конструкторы вызываются автоматически непосредственно перед доступом к любым статическим полям и используются для инициализации членов статического класса. Дополнительные сведения см. в разделе Статические конструкторы.

Спецификация языка C#

Дополнительные сведения см. в разделах Конструкторы экземпляров и Статические конструкторы в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Источник

Оцените статью