Добавить в цитаты Настройки чтения

Страница 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(&quot;В конструкторе XYCoord()&quot;);</b>

<b>  }</b>

<b>  public XYCoord(XYCoord obj) : this(obj.x, obj.y) {</b>

<b>    Console.WriteLine(&quot;В конструкторе XYCoord(obj)&quot;);</b>

<b>  }</b>

<b>  public XYCoord(int i, int j) {</b>

<b>    Console.WriteLine(&quot;В конструкторе XYCoord(int, int)&quot;); 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(&quot;tl.x,</b><b>tl.y:</b><b>&quot; + </b><b>tl.x </b><b>+ </b><b>&quot;, &quot; + </b><b>tl.y);</b>

<div class="fb2-code"><code>&lt;b&gt;    Console.WriteLine(&amp;quot;t2.x,&lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;t2.y:&lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;&amp;quot; + &lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;t2.x &lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;+ &lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;&amp;quot;, &amp;quot; + &lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;t2.y);&lt;/b&gt;</code></div>

<div class="fb2-code"><code>&lt;b&gt;    Console.WriteLine(&amp;quot;t3.x,&lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;t3.y:&lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;&amp;quot; + &lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;t3.x &lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;+ &lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;&amp;quot;, &amp;quot; + &lt;/b&gt;</code></div><div class="fb2-code"><code>&lt;b&gt;t3.y);&lt;/b&gt;</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.