Экземпляры классов создаются с помощью оператора new
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

Инициализаторы конструкторов .

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

инициализатор конструктора экземпляров вида base(список_аргументовнеоб) побуждает вызов конструктора экземпляров из базового класса.

инициализатор конструктора экземпляров вида this(список_аргументовнеоб) побуждает вызов конструктора экземпляров из самого класса

Если у конструктора экземпляров нет инициализатора конструктора, неявно предоставляется инициализатор конструктора вида base().

 

Выполнение конструктора

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

Пример.

 

using System;

 

namespace ConsoleApplication12

{

   

class A

{

   public A()

   {

       PrintFields();

   }

   public virtual void PrintFields() { }

}

class B : A

{

   int x = 1;

   int y;

   public B()

   {

       y = -1;

   }

   public override void PrintFields()

   {

       Console.WriteLine("x = {0}, y = {1}", x, y);

   }

}

 

class Program

{

       

   static void Main(string[] args)

   {

       B b = new B();

   }

}

}

 

В этом примере, если new B() используется для создания экземпляра B, создается следующий вывод:

x = 1, y = 0

 

Пример

using System;

using System.Collections;

using System.Linq;

using System.Text;

 

namespace ConsoleApplication1

{

class A

{

   int x = 1, y = -1, count;

   public A()

   {

       count = 0;

   }

   public A(int n)

   {

       count = n;

   }

}

class B : A

{

   double sqrt2 = Math.Sqrt(2.0);

   ArrayList items = new ArrayList(100);

   int max;

   public B()

       : this(100)

   {

       items.Add("default");

   }

   public B(int n)

       : base(n - 1)

   {

       max = n;

   }

}

 

 

class Program

{

 

   static void Main(string[] args)

   {

       B b = new B();

       B bb = new B(5);

   }

}

}

 

В этом примере содержится несколько инициализаторов переменных, а также содержатся инициализаторы конструкторов обоих видов (base и this).

 

Конструкторы по умолчанию

Конструктор по умолчанию создается автоматически если нет явно заданных конструкторов.

Конструкторы экземпляров для ссылочного типа создаются с модификатором public. Тип может определять несколько конструкторов с различными сигнатурами.

Закрытые конструкторы

Если класс содержит только статические члены и не предназначен для создания экземпляров, добавление пустого закрытого конструктора экземпляров предотвратит создание экземпляров. Пример.

public class Trig
{
private Trig() {}  // Prevent instantiation

public const double PI = 3.14159265358979323846;

public static double Sin(double x) {...}
public static double Cos(double x) {...}
public static double Tan(double x) {...}
}

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






Статические конструкторы

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

объявление_статического_конструктора:
атрибутынеобязательно модификаторы_статического_конструктора идентификатор  ( ) тело_статического_конструктора

модификаторы_статического_конструктора:
externнеобязательно static
static externнеобязательно

тело_статического_конструктора:
блок
;

Объявление_статического_конструктора может включать набор атрибутов и модификатор extern.

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

Если в объявление статического конструктора включен модификатор extern, статический конструктор называется внешним статическим конструктором. Так как объявление внешнего статического конструктора не предоставляет фактическую реализацию, его тело_статического_конструктора состоит из точки с запятой. Для всех других объявлений статического конструктора тело_статического_конструктора состоит из блока, в котором указаны операторы, которые необходимо выполнить, чтобы инициализировать класс.

Статические конструкторы не наследуются и их нельзя вызвать непосредственно.

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

· создан экземпляр типа класса;

· возникла ссылка на любой статический член типа класса.

Если класс содержит метод Main, в котором начинается исполнение, статический конструктор для этого класса выполняется до вызова метода Main.

Для инициализации нового закрытого типа класса сначала создается новый набор статических полей для этого особого типа класса. Каждое из статических полей инициализируется своим значением по умолчанию . Затем выполняются инициализаторы этих статических полей . Наконец выполняется статический конструктор.

 

Пример.

using System;

 

namespace ConsoleApplication12

{

  

 class SimpleClass

{

// Static variable that must be initialized at run time.

static readonly long baseline;

 

// Static constructor is called at most one time, before any

// instance constructor is invoked or member is accessed.

static SimpleClass()

{

   baseline = DateTime.Now.Ticks;

}

}

 

class Program

{

       

   static void Main(string[] args)

   {

      SimpleClass scl = new SimpleClass();

           

   }

}

}

 

Статический конструктор не принимает модификаторы доступа и не имеет параметров.

Статический конструктор вызывается автоматически для инициализации класса перед созданием первого экземпляра или ссылкой на какие-либо статические члены.

Статический конструктор нельзя вызывать напрямую.

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






Создание конструктора копии

В отличие от некоторых языков в C# отсутствует конструктор копии. Если создан новый объект и требуется скопировать значения из существующего объекта, необходимо создать соответствующий метод самостоятельно. Пример (msdn).

class Person{ private string name; private int age; // Copy constructor. public Person(Person previousPerson) {   name = previousPerson.name;   age = previousPerson.age; } // Instance constructor. public Person(string name, int age) {   this.name = name;   this.age = age; } // Get accessor. public string Details {   get   {       return name + " is " + age.ToString();   } }} class TestPerson{ static void Main() {   // Create a new person object.   Person person1 = new Person("George", 40);    // Create another new object, copying person.   Person person2 = new Person(person1);   Console.WriteLine(person2.Details);    // Keep the console window open in debug mode.      Console.WriteLine("Press any key to exit.");   Console.ReadKey(); }}

Константы

Константа – это член класса, представляющий постоянное значение: значение, которое может быть вычислено во время компиляции. Объявление_константы

объявление_константы:
атрибутынеоб модификаторы_константнеоб const тип деклараторы_констант ;

модификатор_константы:
new
public
protected
internal
private

деклараторы_констант:

 

идентификатор = выражение_константы

Константы считаются статическими членами, объявление_константы не требует и не допускает модификатор static.

Тип, указанный в объявлении константы, должен быть типом sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string.

Пример const локальная переменная

using System;

class Program

{

static void Main(string[] args)

{

   const int months = 12;

   Console.WriteLine(months);

}

}

 

Пример const поле

 

using System;

class Calendar

{

public const int months = 12;

}

class Program

{

static void Main(string[] args)

{

   int birthstones = Calendar.months;

   Console.WriteLine(birthstones);

}

}







Поля .

Поле – это член, представляющий переменную, связанную с объектом или классом. Объявление_поля вводит одно или более полей заданного типа.

объявление_поля:
атрибутынеоб модификаторы_полянеоб тип деклараторы_переменных ;

модификатор_поля:
new
public
protected
internal
private
static
readonly
volatile

декларатор_переменной:
идентификатор = инициализатор_переменной

инициализатор_переменных:
выражение
инициализатор_массива

Объявление поля может включать модификатор readonly или volatile, но не оба. Ключевое слово volatile указывает, что поле может быть изменено несколькими потоками, выполняющимися одновременно.

Декларатор переменной состоит из идентификатора, именующего член, за которым необязательно следуют лексема «=» и инициализатор переменной, задающий начальное значение члена.

Тип поля должен быть, по крайней мере, таким же доступным, как само поле.

Значение поля получается в выражении с помощью простого имени или доступа к члену.

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

Значение поля с доступом не только для чтения можно и получать, и изменять с помощью операторов постфиксного увеличения и уменьшения и операторов префиксного увеличения и уменьшения.

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

class A
{
public static int X = 1, Y, Z = 100;
}

эквивалентно

class A
{
public static int X = 1;
public static int Y;
public static int Z = 100;
}





















Дата: 2019-03-05, просмотров: 179.