11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс

^ 11.5. Ссылка this
Нестатические способы класса отличаются от статических наличием в первых ссылки this. Эта ссылка позволяет нестатическому способу "выяснить", для какого объекта способ вызван и производится в данный определенный момент. Значением ссылки this является 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс ссылка на тот объект, обработка которого производится. Ссылку this нельзя и нет необходимости определять – она всегда автоматом включена в каждый нестатический способ класса и она связана с тем объектом, для 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс которого способ вызывается. Время от времени ссылку this именуют дополнительным параметром нестатического способа. Этот параметр представляет в способе вызвавший его объект. Можно именовать последующие четыре вида вероятных применений ссылки this.

  1. Для избежания конфликта 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс имён меж параметрами способа и членами объекта.

  2. Для организации связей меж объектами 1-го класса.

  3. Для воззвания из 1-го конструктора класса к другому конструктору такого же класса.

  4. Для определения расширяющего способа (см [12] – стр. 1360; [1]).

Продемонстрируем 1-ые 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс две нареченные способности внедрения ссылки this на последующем примере.

Определим класс Link, объекты которого можно соединять воединыжды в цепочку – в односвязный перечень. Начало перечня, другими словами ссылку на 1-ый объект, включённый в 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс перечень, представим статическим полем класса (static Link beg). Когда перечень пуст значением beg будет null.

Программка с обозначенным классом:

// 11_05.cs - this и связный перечень

using System;

class Link

{

static Link beg;

Link next 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс;

int numb;

public void add(int numb)

{

this.numb = numb;

if (beg == null) // перечень пуст

{ beg = this; return; }

Link temp = beg;

while (temp.next != null)

temp = temp.next;

temp.next 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс = this;

}

static public void display()

{

Link temp = beg;

while (temp != null)

{

Console.Write(temp.numb + " ");

temp = temp.next;

}

Console.WriteLine();

}

}

class Program

{

static void Main()

{

Link a = new Link(), b = new Link(), c = new 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс Link();

a.add(7);

b.add(-4);

c.add(0);

Link.display();

}

}

Итог выполнения программки:

7 -4 0


Нестатическими полями класса являются int numb и Link next. 1-ое поле необходимо нам только для иллюстрации, значением второго поля 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс будет ссылка на последующий объект, подключённый к списку прямо за рассматриваемым. Последовательность формирования перечня из объектов класса Link можно показать на рисунке.

^ Пустой перечень: beg=null

numb next


7

null
1 элемент: beg


numb next numb next


7







-4

null
2 элемента 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс: beg


Рис.11.1. Формирование перечня объектов


Для сотворения объектов класса Link в программке применен конструктор без характеристик, который автоматом встраивается в класс, когда в нём нет очевидно определённых конструкторов.

Для "подключения" объекта к списку 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс введён нестатический открытый способ:

public void add(int numb)

{

this.numb = numb;

if (beg == null) // перечень пуст

{ beg = this; return; }

Link temp = beg;

while (temp.next != null)

temp = temp.next;

temp.next = this;

}


Особенность способа 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс – имя его параметра совпадает с именованием поля класса. Полное (квалифицированное) имя this.numb относится только к полю объекта. 1-ое действие способа – присваивание полю this.numb значения параметра с этим же именованием. Применение ссылки 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс this позволяет отличать поле объекта, для которого вызван способ add(), от одноимённого параметра.

По дефлоту статическое поле Link beg и нестатическое поле Link next инициализируются значениями null. Пока перечень 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс пуст поле beg сохраняет это пустое значение. Полю beg присваивается ссылка на 1-ый объект класса Link, для которого будет вызван способ add(). Если в перечне уже есть элементы (объекты класса Link), то 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс создаётся локальная переменная Link temp, инициализированная значением ссылки beg. Дальше в цикле перебираются все элементы перечня пока не будет найден элемент, которому никакой объект не подключён. Его полю, доступ к которому обеспечивает 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс квалифицированное имя temp.next, присваивается значение ссылки this, т.е. ссылка на очередной объект класса Link, для которого вызван способ add().

Для поочередного перебора частей перечня и вывода значений полей numb определён статический 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс способ:

static public void display()

{

Link temp = beg;

while (temp != null)

{

Console.Write(temp.numb+" ");

temp = temp.next;

}

Console.WriteLine();

}

В теле способа цикл, в каком локальная переменная temp (ссылка на объекты класса Link 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс) поочередно адресует объекты перечня, начиная с того, который ассоциирован со статической переменной beg.

Для иллюстрации способностей класса Link в классе Program определён способ Main():

static void Main()

{

Link a = new 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс Link(), b = new Link(), c = new Link();

a.add(7);

b.add(-4);

c.add(0);

Link.display();

}

Если в классе определены несколько нестатических конструкторов, то часто комфортно из 1-го конструктора обращаться к другому. Эту 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс возможность, как отмечено ранее, обеспечивает применение ссылки this. Перед тем, как разглядеть эту роль служебного слова this, разглядим нестатические конструкторы.
^ 11.6. Конструкторы объектов класса
Недочет рассмотренных выше класса counter и класса Link 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс – невозможность определять объекты, исходные значения полей которых задаются вне объявления класса. Конструктор умолчания умеет создавать только объекты со значениями полей, определенными инициализацией. При разработке хоть какого объекта класса Real поле m равно 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс 8.0 и поле p равно 0. Нужные программеру исходные значения полей создаваемого объекта можно определять при помощи очевидно объявленного в классе конструктора.

Конструктор объектов (по другому экземпляров) класса – это способ класса, в каком реализованы все деяния 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс, нужные для инициализации объекта класса при его разработке. Для простоты выражение "конструктор объектов (по другому экземпляров) класса" обычно уменьшают и молвят просто о конструкторе. (Направьте внимание, что этот термин не используют к 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс статическому конструктору.)

Снаружи хоть какой конструктор – это способ класса, имя которого всегда совпадает с именованием самого класса. Формат объявления конструктора:

модификаторы_конструктораopt

имя_конструктора

(спецификация_параметровopt)

инициализатор_конструктораopt

тело_конструктора


Имя конструктора 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс – имя конкретно того класса, которому конструктор принадлежит, других имен у конструктора не может быть.

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

В 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс качестве модификаторов конструктора употребляются:

public, protected, internal, private, extern

1-ые четыре модификатора — это модификаторы доступа. Их предназначение мы уже разглядели. О предназначении модификатора extern мы уже упоминали в связи с способами 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс класса.

Спецификация характеристик конструктора может отсутствовать, но если она есть, то содержит спецификации всех характеристик конструктора.

^ Тело конструктора это: или блок – последовательность операторов, заключенная в фигурные скобки; или пустой оператор, обозначаемый только отдельным эмблемой 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс точка с запятой. Пустой оператор в качестве тела употребляется только для конструкторов с модификатором extern. Мы будем в качестве тела конструктора использовать блок.

Предназначение операторов тела конструктора – выполнить инициализацию 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс создаваемого объекта класса.

Инициализатор_конструктора – это особое средство, позволяющее до выполнения операторов тела конструктора обратиться к конструктору базисного класса либо к другому конструктору этого же класса. Для воззвания к конструктору базисного класса употребляется 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс выражение:

: base (список_аргументовopt)

Тут base – служебное слово; необязательный перечень аргументов – перечень выражений, соответственных характеристикам вызываемого конструктора базисного класса.

Инициализатор конструктора, выполняющий воззвание к другому конструктору собственного же класса, смотрится так 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс:

: this (список_аргументовopt)

Тут this – служебное слово; необязательный перечень аргументов – перечень выражений, соответственных характеристикам другого конструктора.

Хотя язык C# при помощи механизма сбора мусора (garbage collection) в достаточной мере защищён от таких 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс заморочек как "утечка памяти" и "висящие ссылки", но в C# остаётся, к примеру, задачка глубочайшего копирования и принципиальным вопросом в ряде всевозможных случаев является приведение типов, введённых пользовательскими классами. Часто для квалифицированного решения 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс нареченных заморочек можно воспользоваться конструкторами различных видов. В классе могут быть очевидно объявлены:

При отсутствии в объявлении класса любых конструкторов, компилятор 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс встраивает в класс конструктор умолчания – открытый конструктор без характеристик. Его роль – задать исходные значения полей создаваемого объекта класса при помощи инициализаторов, присутствующих в объявлениях полей, или по дефлоту. Если создатель 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс класса вожделеет по особенному инициализировать поля объектов, или конструктор умолчания просто нужен в классе вместе с другими конструкторами, – его требуется очевидно включать в объявления класса. Формат объявления:

class CLASS {

public CLASS() {

операторы_тела_конструктораopt

}

}

Конструктор копирования 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс это конструктор с одним параметром, тип которого – ссылка на объект собственного класса. Таковой конструктор по дефлоту не создаётся, а часто необходимо в программке иметь возможность сделать точную копию уже имеющегося 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс объекта. Присваивание ссылке с типом класса значения ссылки на имеющийся объект такого же класса копии объекта не создаёт. Две ссылки начинают адресовать один и тот же объект. Примеры таковой ситуации мы уже приводили, разбирая 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс отличия ссылок от переменных с типом значений. В последующей программке объявлен класс с конструктором копирования.

// 11_06.cs конструкторы

using System;

class CL{

public int dom = 6;

public CL() { } // конструктор умолчания

public CL(CL ob 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс) { // конструктор копирования

dom = ob.dom;

}

}

class Program {

static void Main() {

CL one = new CL();

CL two = new CL(one);

two.dom = 5*one.dom;

Console.WriteLine("one.dom="+one.dom+", two.dom="+two 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс.dom);

}

}


Итог выполнения программки:

one.dom=6, two.dom=30


В классе CL конструктор без характеристик объявлен очевидно. Для простоты примера в классе CL всего одно открытое поле int dom. В способе Main() ссылка one связана 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс с объектом, инициализированным конструктором без характеристик. Объект, адресуемый ссылкой two – копия объекта one, но эти объекты независимы, что иллюстрируют результаты выполнения программки.

Особенности воззваний конструкторов 1-го класса друг к другу 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс расмотрим на промере класса, особенным образом представляющего вещественные числа. В научной записи (в научной нотации) число записывается в виде произведения 2-ух чисел: целой степени p числа 10 и числа m, удовлетворяющего условию 1.0 <= m < 10.0. Время от 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс времени p именуют показателем, а m – мантиссой числа. Таким макаром, запись каждого числа смотрится так: m*10p. (При выводе значения числа в научной нотации строительство в степень будем обозначать эмблемой ^.).

Примеры 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс: неизменная Авогадро: 6.02486 * 1023 (г*моль)-1,

заряд электрона: -4.80286 * 10-10 СГСЭ.

Определим класс Real для представления чисел в научной нотации. В классе определим способ display() для вывода на консоль значения объекта и способ incrementM() для роста на 1 значения 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс мантиссы числа. При всем этом значение числа возрастает, естественно, не на 1, а на 10p. Для мантисс и характеристик введем закрытые поля double m и int p. Определение класса может быть таким 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс (программка 11_07.cs):

using System;

class Real // Класс чисел в научной нотации

{ // Закрытые поля:

double m = 8.0; // мантисса - очевидная инициализация

int p; // порядок - инициализация по дефлоту

// Способ - приращение мантиссы:

public void incrementM()

{

m += 1;

if (m >= 10)

{

m /= 10;

p++;

}

}

// Способ 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс для вывода значения числа (объекта):

public void display(string name)

{

string form = name + "\t = {0,8:F5}*10^{1,-3:D2}";

Console.WriteLine(form, m, p);

}

// Конструктор вида:

public Real(double mi, int pi)

{

m = mi 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс;

p = pi;

reduce();

}

// конструктор приведения типов:

public Real(double mi)

: this(mi, 0)

{ }

// конструктор копирования:

public Real(Real re)

: this(re.m, re.p)

{ }

// конструктор умолчания:

public Real()

{ }

// "Внутренний" для класса способ 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс:

void reduce() // Приведение числа к каноническому виду.

{

double sign = 1; if (m < 0) {sign = -1; m = -m; }

for (; m >= 10; m /= 10, p += 1) ;

for (; m < 1; m *= 10, p -= 1) ;

m *= sign;

}

}

Посреди способов класса нам на данный момент принципиально 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс разглядеть очевидно определенные в классе конструкторы.

Конструктор вида:

public Real(double mi, int pi)

{

m = mi;

p = pi;

reduce();

}

Характеристики определяют значения мантиссы m и порядка p создаваемого объекта класса. В согласовании с 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс правилами записи чисел в научной нотации для их нужно соблюдение условия:

1.0 <= m < 10.0.

Потому что значение аргумента mi при воззвании к конструктору может не удовлетворять этому условию, то в теле конструктора вызывается закрытый 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс для наружных воззваний способ void reduce(). Его задачка – необходимым образом конвертировать значения полей m и p.

Конструктор приведения типов:

public Real(double mi) : this(mi, 0) { }

Это личный случай конструктора вида с одним 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс параметром. В нашем примере он сформировывает объект класса Real по одному значению типа double, использованному в качестве аргумента. Тем этот конструктор позволяет конвертировать числовое значение в объект класса Real. В конструкторе 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс использован инициализатор, содержащий воззвание this(mi, 0) к конструктору с заголовком Real(double mi, int pi). Значение второго аргумента, определяющего значение поля int p, задано нулевой константой, что соответствует естественному для арифметики методу записи вещественного 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс числа.

Констуктор копирования:

public Real(Real re) : this(re.m, re.p) { }

Позволяет сделать копию объекта. Ещё раз обратим внимание на его отличие от операции присваивания, применение которой копирует только значение 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс ссылки на объект. После присваивания ссылок на один объект начинают указывать несколько переменных (ссылок). Тело конструктора копирования в нашем примере не содержит операторов. Для присваивания значений полям создаваемого объекта употребляется 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс инициализатор конструктора, содержащий воззвание this(re.m, re.p) к конструктору вида. Заместо инициализатора можно было бы присваивать значения переменным m и p в теле конструктора. (Конструктор копирования по дефлоту не создается 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс.)

Конструктор умолчания, т.е. конструктор без характеристик:

public Real() { }

Отсутствие характеристик, отсутствие (в данном примере) инициализатора конструктора и пустое тело конструктора вызывает вопрос. А для чего нужен таковой конструктор? Ведь в прошлом 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс варианте класса Real объявления такового конструктора не было.

При наличии очевидно определенных конструкторов (хотя бы 1-го) компилятор не встраивает в определение класса конструктор с пустым перечнем характеристик. По мере надобности таковой конструктор необходимо объявлять очевидно 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс, что и изготовлено. Конструктор умолчания делает инициализацию полей класса в согласовании с теми значениями, которые указаны в декларации класса. Но, в теле конструктора умолчания полям объекта можно было бы присвоить и другие 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс значения.

Пример внедрения конструкторов класса (программка 11_07.cs):

static void Main()

{

Real number = new Real(303.0, 1); // конструктор вида

number.display("number");

Real number1 = new Real(0.000321);// констр. приведения типов

number1.display("number1");

Real numCopy = new Real(number 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс);// конструктор копирования

number1 = number; // присваивание ссылок

number.incrementM(); // изменение объекта

number.display("number");

number1.display("number1");

numCopy.display("numCopy"); // копия сохранила значение

Real numb = new Real(); // конструктор умолчания

numb.display("numb");

}


Итог выполнения программки:

number = 3,03000 * 10^03

number 11.5. Ссылка this - В. В. Подбельский Язык C#. Базовый курс1 = 3,21000 * 10^-04

number = 4,03000 * 10^03

number1 = 4,03000 * 10^03

numCopy = 3,03000 * 10^03

numb = 8,00000 * 10^00



112-rrsrryosrrrrryor-rrrsrsrss-ssrrssr-r-r-rrrrrrr-srrrrrryorr-rsrrssrrrrrrr-rsrrrsryossryos.html
112-struktura-rabotayushih-po-kategoriyam-dolya-rinka-marketing-i-prodazhi.html
112-vodootvedenie-generalnij-plan-gorodskogo-poseleniya-rzhavki-solnechnogorskogo-municipalnogo-rajona-moskovskoj-oblasti.html