Страница 104 из 502
Когда приходится работать с перегружаемыми конструкторами, то иногда очень полезно предоставить возможность одному конструктору вызывать другой. В C# это дается с помощью ключевого слова this. Ниже приведена общая форма такого вызова.
<b><i>имя_конструктора{список_параметров1) :</i> this (<i>список_параметров2) {</i></b>
<b><i>//</i> ... Тело конструктора, которое может быть пустым.</b>
<b>}</b>
В исходном конструкторе сначала выполняется перегружаемый конструктор, список параметров которого соответствует критерию список_параметров2, а затем все остальные операторы, если таковые имеются в исходном конструкторе. Ниже приведен соответствующий пример.
<b>// Продемонстрировать вызов конструктора с помощью ключевого слова this.</b>
<b>using System;</b>
<b>class XYCoord { </b>
<b> public int x, y;</b>
<b> public XYCoord() : this(0, 0) {</b>
<b> Console.WriteLine("В конструкторе XYCoord()");</b>
<b> }</b>
<b> public XYCoord(XYCoord obj) : this(obj.x, obj.y) {</b>
<b> Console.WriteLine("В конструкторе XYCoord(obj)");</b>
<b> }</b>
<b> public XYCoord(int i, int j) {</b>
<b> Console.WriteLine("В конструкторе XYCoord(int, int)"); x = i;</b>
<b> y = j;</b>
<b> }</b>
<b>}</b>
<b>class OverloadConsDemo { </b>
<b> static void Main() {</b>
<b> XYCoord tl = new XYCoord();</b>
<b> XYCoord t2 = new XYCoord(8, 9);</b>
<b> XYCoord t3 = new XYCoord(t2);</b>
<b> Console.WriteLine("tl.x,</b><b>tl.y:</b><b>" + </b><b>tl.x </b><b>+ </b><b>", " + </b><b>tl.y);</b>
<div class="fb2-code"><code><b> Console.WriteLine(&quot;t2.x,</b></code></div><div class="fb2-code"><code><b>t2.y:</b></code></div><div class="fb2-code"><code><b>&quot; + </b></code></div><div class="fb2-code"><code><b>t2.x </b></code></div><div class="fb2-code"><code><b>+ </b></code></div><div class="fb2-code"><code><b>&quot;, &quot; + </b></code></div><div class="fb2-code"><code><b>t2.y);</b></code></div>
<div class="fb2-code"><code><b> Console.WriteLine(&quot;t3.x,</b></code></div><div class="fb2-code"><code><b>t3.y:</b></code></div><div class="fb2-code"><code><b>&quot; + </b></code></div><div class="fb2-code"><code><b>t3.x </b></code></div><div class="fb2-code"><code><b>+ </b></code></div><div class="fb2-code"><code><b>&quot;, &quot; + </b></code></div><div class="fb2-code"><code><b>t3.y);</b></code></div>
<b> }</b>
<b>}</b>
Выполнение этого кода приводит к следующему результату.
<b>В конструкторе XYCoord(int, int)</b>
<b>В конструкторе XYCoord()</b>
<b>В конструкторе XYCoord(int, int)</b>
<b>В конструкторе XYCoord(int, int)</b>
<b>В конструкторе XYCoord(obj)</b>
<b>tl.x, tl.y: 0, 0 </b>
<b>t2.x, t2.у: 8, 9 </b>
<b>t3.x, t3.у: 8, 9</b>
Код в приведенном выше примере работает следующим образом. Единственным конструктором, фактически инициализирующим поля х и у в классе XYCoord, является конструктор XYCoord(int, int).А два других конструктора просто вызывают этот конструктор с помощью ключевого слова this. Например, когда создается объект t1, то вызывается его конструктор XYCoord(), что приводит к вызову this(0, 0), который в данном случае преобразуется в вызов конструктора XYCoord(0, 0). То же самое происходит и при создании объекта t2.
Вызывать перегружаемый конструктор с помощью ключевого слова this полезно, в частности, потому, что он позволяет исключить ненужное дублирование кода. В приведенном выше примере нет никакой необходимости дублировать во всех трех конструкторах одну и ту же последовательность инициализации, и благодаря применению ключевого слова this такое дублирование исключается. Другое преимущество организации подобного вызова перезагружаемого конструктора заключается в возможности создавать конструкторы с задаваемыми "по умолчанию" аргументами, когда эти аргументы не указаны явно. Ниже приведен пример создания еще одного конструктора XYCoord.