<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - Exerion</title>
		<link>https://www.cyberforum.ru/blogs/203150/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Fri, 04 Sep 2026 12:05:46 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - Exerion</title>
			<link>https://www.cyberforum.ru/blogs/203150/</link>
		</image>
		<item>
			<title>IDisposable - правильное использование</title>
			<link>https://www.cyberforum.ru/blogs/203150/3594.html</link>
			<pubDate>Tue, 16 Jun 2015 12:53:18 GMT</pubDate>
			<description>Довольно долгое время я мучился в попытках познать тонкости интерфейса IDisposable и метода...</description>
			<content:encoded><![CDATA[<div>Довольно долгое время я мучился в попытках познать тонкости интерфейса IDisposable и метода Dispose, особенно вводило меня в ступор наличие перегрузки этого метода с булевым аргументом. Со временем те или иные аспекты становились яснее, но полной картины у меня в голове не было до тех пор, пока я не наткнулся на ответ/статью по данной теме на stackoverflow.com, мой вольный перевод  которой вы можете увидеть ниже.<br />
<br />
<br />
Смысл Dispose - освободить неуправляемые ресурсы (прим.переводчика - в качестве неуправляемых ресурсов можно привести соединения с базами данных, сокеты, дескрипторы окон и т.д). Освобождение неуправляемых ресурсов должно быть произведено в определённый момент, иначе они не будут освобождены вообще. Сборщик мусора (garbage collector, GC) не знает, <b>как</b> вызывать метод DeleteHandle() на переменной типа IntPtr, а также не знает, <b>нужно ли</b> вообще его вызывать.<br />

<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message">Прим.: Что такое неуправляемые ресурсы? Если вы пользуетесь чем-либо внутри Microsoft .NET Framework - это управляемые ресурсы. Если вы решили полазать по MSDN самостоятельно, это неуправляемые ресурсы. Всё, что используется, когда вы вызываете P/Invoke чтобы выбраться за границы уютненького мира возможностей .NET Framework - неуправляемые ресурсы, и вы теперь ответственны за их очистку.</div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table>Создаваемый вами объект должен иметь метод, который мог бы быть вызван внешним миром для очистки неуправляемых ресурсов. Существует даже стандартизированное название для этого метода:<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="462755666"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="462755666" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> Dispose<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Мало того, даже был создан интерфейс - IDisposable - который имеет всего один этот метод:<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="250926964"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="250926964" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">interface</span> IDisposable
<span class="br0">&#123;</span>
&nbsp; &nbsp;<span class="kw4">void</span> Dispose<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Итак, в своём объекте вы реализуете интерфейс IDisposable и таким образом даёте обещание, что вы написали этот единственный метод для очистки неуправляемых ресурсов:<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="505734528"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="505734528" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> Dispose<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp;Win32<span class="sy0">.</span><span class="me1">DestroyHandle</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">gdiCursorBitmapStreamFileHandle</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Вот и всё. <b>Однако можно сделать лучше.</b><br />
________________________________________ ________________________________________ ___<br />
<br />
Что, если ваш объект выделил 250Мб System.Drawing.Bitmap (т.е. управляемый .NET Bitmap класс) в качестве некоего кадрового буфера? Безусловно, это управляемый объект, и сборщик мусора освободит память, занимаемую им. Но действительно ли вы хотите оставить кусок памяти в 250Мб просто лежать где-то, дожидаясь когда сборщик мусора удосужится добраться и освободить его? А что, если там же есть открытое соединение с базой данных? Однозначно мы не хотели бы оставлять это соединение открытым, ожидая пока GC финализирует объект.<br />
<br />
Поэтому мы:<ul><li>разберёмся с неуправляемыми ресурсами (потому что мы должны), и</li>
<li>разберёмся с управляемыми ресурсами (потому что мы хотим быть полезными) :)</li>
</ul><br />
Итак, давайте обновим наш Dispose() метод, чтобы избавиться от управляемых ресурсов:<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="949065410"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="949065410" style="height: 302px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="de1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> Dispose<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp;<span class="co1">//Free unmanaged resources</span>
&nbsp; &nbsp;Win32<span class="sy0">.</span><span class="me1">DestroyHandle</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">gdiCursorBitmapStreamFileHandle</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp;<span class="co1">//Free managed resources too</span>
&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">databaseConnection</span> <span class="sy0">!=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp;<span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="sy0">.</span><span class="me1">databaseConnection</span><span class="sy0">.</span><span class="me1">Dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="sy0">.</span><span class="me1">databaseConnection</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="sy0">;</span>
&nbsp; &nbsp;<span class="br0">&#125;</span>
&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">frameBufferImage</span> <span class="sy0">!=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp;<span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="sy0">.</span><span class="me1">frameBufferImage</span><span class="sy0">.</span><span class="me1">Dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="sy0">.</span><span class="me1">frameBufferImage</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="sy0">;</span>
&nbsp; &nbsp;<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Всё это здорово, <b>однако можно сделать лучше!</b><br />
________________________________________ ________________________________________ ___<br />
<br />
А что, если человек забыл вызывать Dispose() на вашем объекте? Произойдёт утечка неуправляемых ресурсов!<br />

<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message">Прим.: Утечки управляемых ресурсов не будет, потому что сборщик мусора рано или поздно запустится в фоновом потоке и очистит память, занимаемую любыми неиспользуемыми объектами. Сюда входит ваш объект и любые используемые вами управляемые объекты (те же Bitmap и DbConnection).</div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table>Если человек забыл вызвать Dispose(), мы всё ещё можем спасти ситуацию. Мы можем вызывать этот метод, когда сборщик мусора доберётся до объекта, чтобы освободить (финализировать) его.<br />

<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message">Прим.: Сборщик мусора рано или поздно освобождает все управляемые объекты путём вызова метода Finalize на объекте. GC ничего не знает о вашем Dispose методе и ему нет до него никакого дела. Это всего лишь название, которое мы выбрали для метода, вызываемого нами для очистки неуправляемых ресурсов.</div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table>Уничтожение объекта сборщиком мусора - идеальный момент для освобождения этих надоедливых неуправляемых ресурсов. Мы сделаем это, переопределив метод Finalize().<br />

<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message">Прим.: В C# вы не переопределяете метод Finalize() явно. Вместо этого вы пишете метод, который похож на C++ деструктор, а компилятор принимает его как вашу реализацию метода Finalize():</div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table><div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="523563159"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="523563159" style="height: 110px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
</pre></td><td class="de1"><pre class="de1">~MyObject<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="co1">//мы были финализированы (т.е. уничтожены), вызовите Dispose() на случай, если пользователь забыл сделать это</span>
&nbsp; &nbsp; Dispose<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//&lt;--ПРЕДУПРЕЖДЕНИЕ! Тут кроется ошибка! Читайте ниже.</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Однако в этом коде есть ошибка. Сборщик мусора работает в фоновом потоке, и вы не знаете последовательность, в которой два объекта будут уничтожены. Вполне возможно, что в коде вашего Dispose() метода управляемый объект, от которого вы хотите избавиться, больше не существует:<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="45083729"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="45083729" style="height: 302px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="de1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> Dispose<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp;<span class="co1">//Освободить неуправляемые ресурсы</span>
&nbsp; &nbsp;Win32<span class="sy0">.</span><span class="me1">DestroyHandle</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">gdiCursorBitmapStreamFileHandle</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp;<span class="co1">//Освободить также и управляемые ресурсы</span>
&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">databaseConnection</span> <span class="sy0">!=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp;<span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="sy0">.</span><span class="me1">databaseConnection</span><span class="sy0">.</span><span class="me1">Dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy0">&lt;--</span> ошибка, GC уже уничтожил это
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="sy0">.</span><span class="me1">databaseConnection</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="sy0">;</span>
&nbsp; &nbsp;<span class="br0">&#125;</span>
&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">frameBufferImage</span> <span class="sy0">!=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp;<span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="sy0">.</span><span class="me1">frameBufferImage</span><span class="sy0">.</span><span class="me1">Dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy0">&lt;--</span> ошибка, GC уже уничтожил это
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="sy0">.</span><span class="me1">frameBufferImage</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="sy0">;</span>
&nbsp; &nbsp;<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Что вам нужно, так это способ, с помощью которого метод Finalize() может сказать методу Dispose() не трогать управляемые ресурсы (потому что их может уже и не быть) во время освобождения неуправляемых.<br />
Стандартный паттерн для этого - из обоих методов Finalize() и Dispose() вызывать третий(!) метод, куда вы передадите Boolean значение, означающее, что вы вызываете его из Dispose() (в противоположность Finalize()), в том смысле, что можно безопасно освобождать управляемые ресурсы.<br />
<br />
Этот внутренний (internal) метод мог бы иметь произвольное название вроде &quot;CoreDispose&quot; или &quot;MyInternalDispose&quot;, но традиционно его называют Dispose(Boolean) (прим.переводчика - откуда и растёт непонимание):<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="826906315"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="826906315" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">void</span> Dispose<span class="br0">&#40;</span>Boolean disposing<span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Но более полезное для понимания имя параметра могло быть таким:<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="611902374"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="611902374" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="de1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">void</span> Dispose<span class="br0">&#40;</span>Boolean itIsSafeToAlsoFreeManagedObjects<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp;<span class="co1">//Освободить неуправляемые ресурсы</span>
&nbsp; &nbsp;Win32<span class="sy0">.</span><span class="me1">DestroyHandle</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">gdiCursorBitmapStreamFileHandle</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp;<span class="co1">//Освободить также управляемые ресурсы, но только если вызов был из Dispose</span>
&nbsp; &nbsp;<span class="co1">//(если вызов был из Finalize, эти объекты могут уже не существовать)</span>
&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>itIsSafeToAlsoFreeManagedObjects<span class="br0">&#41;</span> &nbsp;
&nbsp; &nbsp;<span class="br0">&#123;</span> &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">databaseConnection</span> <span class="sy0">!=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">this</span><span class="sy0">.</span><span class="me1">databaseConnection</span><span class="sy0">.</span><span class="me1">Dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">this</span><span class="sy0">.</span><span class="me1">databaseConnection</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">frameBufferImage</span> <span class="sy0">!=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">this</span><span class="sy0">.</span><span class="me1">frameBufferImage</span><span class="sy0">.</span><span class="me1">Dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">this</span><span class="sy0">.</span><span class="me1">frameBufferImage</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp;<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Теперь вы меняете свою реализацию метода IDisposable.Dispose() на:<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="208671542"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="208671542" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> Dispose<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp;Dispose<span class="br0">&#40;</span><span class="kw1">true</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//Я вызываю тебя из Dispose(), это безопасно</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>...и реализацию финализатора:<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="13356963"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="13356963" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1">~MyObject<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp;Dispose<span class="br0">&#40;</span><span class="kw1">false</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//Я *НЕ* вызываю тебя из Dispose(), это *НЕ* безопасно</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message">Прим.: если ваш объект наследуется от объекта, который реализует Dispose, не забудьте вызывать Dispose базового класса, когда вы переопределяете Dispose:</div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table><div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="661169580"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="661169580" style="height: 206px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="de1"><pre class="de1"><span class="kw1">public</span> Dispose<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">try</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Dispose<span class="br0">&#40;</span><span class="kw1">true</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//true: безопасно для освобождения управляемых ресурсов</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">finally</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">base</span><span class="sy0">.</span><span class="me1">Dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Всё это здорово, <b>однако можно сделать лучше!</b><br />
________________________________________ ________________________________________ ___<br />
<br />
Если пользователь вызывает Dispose() на вашем объекте, то всё будет очищено. Позднее, когда сборщик мусора доберётся до объекта и вызовет Finalize, он снова вызовет Dispose.<br />
<br />
Не только это расточительно, но и если ваш объект имеет мусорные ссылки на объекты, которые вы уже очистили с прошлого вызова Dispose(), вы вызовете их очистку повторно!<br />
<br />
Вы могли заметить в моём коде, что я был аккуратен и удалял ссылки на уже очищенные объекты, таким образом я не вызывал Dispose на &quot;мусорных ссылках&quot;. Однако даже это не остановит этот неуловимый баг.<br />
<br />
Когда пользователь вызывает Dispose(), дескриптор gdiCursorBitmapStreamFileHandle уничтожается. Позднее, когда отработает сборщик мусора, он попытается уничтожить тот же дескриптор опять.<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="215315956"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="215315956" style="height: 126px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
</pre></td><td class="de1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">void</span> Dispose<span class="br0">&#40;</span>Boolean iAmBeingCalledFromDisposeAndNotFinalize<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp;<span class="co1">//Free unmanaged resources</span>
&nbsp; &nbsp;Win32<span class="sy0">.</span><span class="me1">DestroyHandle</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">.</span><span class="me1">gdiCursorBitmapStreamFileHandle</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy0">&lt;--</span> двойное уничтожение
&nbsp; &nbsp;<span class="sy0">...</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Мы можем исправить это, указав сборщику мусора, что ему не нужно беспокоиться о финализации объекта - ресурсы уже очищены и работы больше нет. Это делается путём вызова GC.SuppressFinalize() в методе Dispose():<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="534733527"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="534733527" style="height: 110px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
</pre></td><td class="de1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> Dispose<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp;Dispose<span class="br0">&#40;</span><span class="kw1">true</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//Я вызываю тебя из Dispose(), это безопасно</span>
&nbsp; &nbsp;GC<span class="sy0">.</span><span class="me1">SuppressFinalize</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//Эй, GC. Больше не беспокойся о вызове Finalize</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Теперь, когда пользователь вызывает Dispose(), мы:<ul><li>очистили неуправляемые ресурсы</li>
<li>очистили управляемые ресурсы</li>
</ul>Сборщику мусора нет смысла запускать финализатор - мы обо всём уже позаботились.<br />
<br />
<b><div align="right">Текст оригинала на английском: <a rel="nofollow noopener noreferrer" href="http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface" target="_blank" title="http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface">stackoverflow</a></div></b></div>

]]></content:encoded>
			<dc:creator>Exerion</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/203150/3594.html</guid>
		</item>
		<item>
			<title><![CDATA[Алгоритм генерирования поля для игры "Судоку"]]></title>
			<link>https://www.cyberforum.ru/blogs/203150/1323.html</link>
			<pubDate>Sat, 27 Apr 2013 11:34:32 GMT</pubDate>
			<description>---Цитата (сообщение от Exerion)--- 
Всё не так просто, как два вложенных друг в друга цикла....</description>
			<content:encoded><![CDATA[<div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
				<img loading="lazy" decoding="async" title="Цитата" src="//cyberstatic.net/images/buttons/quote_icon.png" alt="Цитата" />
				Сообщение от <strong>Exerion</strong>
				<a href="showthread.php?p=4011706"><img loading="lazy" decoding="async" class="inlineimg" src="//cyberstatic.net/images/buttons/viewpost-right.png" border="0" alt="Посмотреть сообщение" /></a>
	         	
	        </div>
	        <div class="message">Всё не так просто, как два вложенных друг в друга цикла.<br />
Делать было нечего, задачка показалась интересной, поэтому за два часа наговнокодил первое, что пришло в голову:<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="322521335"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="322521335" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
</pre></td><td class="de1"><pre class="de1"><span class="kw4">class</span> Program
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">int</span><span class="br0">&#91;</span>,<span class="br0">&#93;</span> playField <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw4">int</span><span class="br0">&#91;</span><span class="nu0">9</span>, <span class="nu0">9</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> wrongNumbers <span class="sy0">=</span> <span class="kw3">new</span> List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">static</span> <span class="kw4">void</span> Main<span class="br0">&#40;</span><span class="kw4">string</span><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;Press ENTER to generate field&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">ReadLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; InitField<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> result <span class="sy0">=</span> <span class="kw1">false</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy0">=</span> GenerateField<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">!</span>result<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span><span class="es0">\n</span>Generation failed. Press ENTER to generate again.<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">ReadLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy0">=</span> GenerateField<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;Generated field:<span class="es0">\n</span><span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PrintField<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">ReadLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">void</span> InitField<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="nu0">9</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> j <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> j <span class="sy0">&lt;</span> <span class="nu0">9</span><span class="sy0">;</span> j<span class="sy0">++</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playField<span class="br0">&#91;</span>i, j<span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">bool</span> CheckLine<span class="br0">&#40;</span><span class="kw4">int</span> line, <span class="kw4">int</span> number<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="nu0">9</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>playField<span class="br0">&#91;</span>line, i<span class="br0">&#93;</span> <span class="sy0">==</span> number<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;[line-&quot;</span> <span class="sy0">+</span> line <span class="sy0">+</span> <span class="st0">&quot;] number &quot;</span> <span class="sy0">+</span> number <span class="sy0">+</span> <span class="st0">&quot;banned&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span>wrongNumbers<span class="sy0">.</span><span class="me1">Contains</span><span class="br0">&#40;</span>number<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wrongNumbers<span class="sy0">.</span><span class="kw1">Add</span><span class="br0">&#40;</span>number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">true</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;[line-&quot;</span> <span class="sy0">+</span> line <span class="sy0">+</span> <span class="st0">&quot;] number &quot;</span> <span class="sy0">+</span> number <span class="sy0">+</span> <span class="st0">&quot;passed!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">false</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">bool</span> CheckColumn<span class="br0">&#40;</span><span class="kw4">int</span> col, <span class="kw4">int</span> number<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> j <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> j <span class="sy0">&lt;</span> <span class="nu0">9</span><span class="sy0">;</span> j<span class="sy0">++</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>playField<span class="br0">&#91;</span>j, col<span class="br0">&#93;</span> <span class="sy0">==</span> number<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;[col-&quot;</span> <span class="sy0">+</span> col <span class="sy0">+</span> <span class="st0">&quot;] number &quot;</span> <span class="sy0">+</span> number <span class="sy0">+</span> <span class="st0">&quot;banned&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>wrongNumbers<span class="sy0">.</span><span class="me1">Contains</span><span class="br0">&#40;</span>number<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wrongNumbers<span class="sy0">.</span><span class="kw1">Add</span><span class="br0">&#40;</span>number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">true</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;[col-&quot;</span> <span class="sy0">+</span> col <span class="sy0">+</span> <span class="st0">&quot;] number &quot;</span> <span class="sy0">+</span> number <span class="sy0">+</span> <span class="st0">&quot;passed!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">false</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">bool</span> CheckBlock<span class="br0">&#40;</span><span class="kw4">int</span> line, <span class="kw4">int</span> col, <span class="kw4">int</span> number<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> blockLine <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> blockCol <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">double</span> blockNum <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blockNum <span class="sy0">=</span> line <span class="sy0">+</span> <span class="nu0">1</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blockNum <span class="sy0">=</span> blockNum <span class="sy0">/</span> <span class="nu0">3</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blockNum <span class="sy0">=</span> Math<span class="sy0">.</span><span class="me1">Ceiling</span><span class="br0">&#40;</span>blockNum<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blockLine <span class="sy0">=</span> Convert<span class="sy0">.</span><span class="me1">ToInt32</span><span class="br0">&#40;</span>blockNum<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blockNum <span class="sy0">=</span> col <span class="sy0">+</span> <span class="nu0">1</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blockNum <span class="sy0">=</span> blockNum <span class="sy0">/</span> <span class="nu0">3</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blockNum <span class="sy0">=</span> Math<span class="sy0">.</span><span class="me1">Ceiling</span><span class="br0">&#40;</span>blockNum<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blockCol <span class="sy0">=</span> Convert<span class="sy0">.</span><span class="me1">ToInt32</span><span class="br0">&#40;</span>blockNum<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>blockLine <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> blockLine <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>blockCol <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> blockCol <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="nu0">3</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> j <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> j <span class="sy0">&lt;</span> <span class="nu0">3</span><span class="sy0">;</span> j<span class="sy0">++</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>playField<span class="br0">&#91;</span>i <span class="sy0">+</span> <span class="br0">&#40;</span>blockLine <span class="sy0">-</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">*</span> <span class="nu0">3</span>, j <span class="sy0">+</span> <span class="br0">&#40;</span>blockCol <span class="sy0">-</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">*</span> <span class="nu0">3</span><span class="br0">&#93;</span> <span class="sy0">==</span> number<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;[block &quot;</span> <span class="sy0">+</span> blockLine <span class="sy0">+</span> <span class="st0">&quot;-&quot;</span> <span class="sy0">+</span> blockCol <span class="sy0">+</span> <span class="st0">&quot; (&quot;</span> <span class="sy0">+</span> line <span class="sy0">+</span> <span class="st0">&quot;+&quot;</span> <span class="sy0">+</span> col <span class="sy0">+</span> <span class="st0">&quot;)] banned number: &quot;</span> <span class="sy0">+</span> number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>wrongNumbers<span class="sy0">.</span><span class="me1">Contains</span><span class="br0">&#40;</span>number<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wrongNumbers<span class="sy0">.</span><span class="kw1">Add</span><span class="br0">&#40;</span>number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">true</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">false</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">bool</span> GenerateField<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Random rnd <span class="sy0">=</span> <span class="kw3">new</span> Random<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> number <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> result <span class="sy0">=</span> <span class="kw1">true</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="nu0">9</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> j <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> j <span class="sy0">&lt;</span> <span class="nu0">9</span><span class="sy0">;</span> j<span class="sy0">++</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number <span class="sy0">=</span> rnd<span class="sy0">.</span><span class="me1">Next</span><span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy0">=</span> CheckLine<span class="br0">&#40;</span>i, number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>result<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number <span class="sy0">=</span> rnd<span class="sy0">.</span><span class="me1">Next</span><span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>wrongNumbers<span class="sy0">.</span><span class="me1">Count</span> <span class="sy0">&gt;</span> <span class="nu0">8</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; InitField<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wrongNumbers<span class="sy0">.</span><span class="me1">Clear</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">false</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>wrongNumbers<span class="sy0">.</span><span class="me1">Contains</span><span class="br0">&#40;</span>number<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; number <span class="sy0">=</span> rnd<span class="sy0">.</span><span class="me1">Next</span><span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy0">=</span> CheckLine<span class="br0">&#40;</span>i, number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy0">=</span> CheckColumn<span class="br0">&#40;</span>j, number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>result<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j<span class="sy0">--;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy0">=</span> CheckBlock<span class="br0">&#40;</span>i, j, number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>result<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j<span class="sy0">--;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playField<span class="br0">&#91;</span>i, j<span class="br0">&#93;</span> <span class="sy0">=</span> number<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span>number <span class="sy0">+</span> <span class="st0">&quot; &nbsp;[!] number &quot;</span> <span class="sy0">+</span> number <span class="sy0">+</span> <span class="st0">&quot; accepted!<span class="es0">\n</span>PlayField[&quot;</span> <span class="sy0">+</span> i <span class="sy0">+</span> <span class="st0">&quot;,&quot;</span> <span class="sy0">+</span> j <span class="sy0">+</span> <span class="st0">&quot;] = &quot;</span> <span class="sy0">+</span> number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wrongNumbers<span class="sy0">.</span><span class="me1">Clear</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">true</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">void</span> PrintField<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ─ │ ┌ ┐ └ ┘ ├ ┤ ┬ ┴ ┼</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ═ ║ ╔ ╗ ╚ ╝ ╠ ╣ ╦ ╩ ╬</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ╒ ╓ ╕ ╖ ╘ ╙ ╛ ╜</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ╞ ╟ ╡ ╢ ╤ ╥ ╧ ╨ ╪ ╫ </span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;╔══╤══╤══╦══╤══╤══╦══╤══╤══╗&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="nu0">3</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PrintLine<span class="br0">&#40;</span>i <span class="sy0">*</span> <span class="nu0">3</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;╟──┼──┼──╫──┼──┼──╫──┼──┼──╢&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PrintLine<span class="br0">&#40;</span>i <span class="sy0">*</span> <span class="nu0">3</span> <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;╟──┼──┼──╫──┼──┼──╫──┼──┼──╢&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PrintLine<span class="br0">&#40;</span>i <span class="sy0">*</span> <span class="nu0">3</span> <span class="sy0">+</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>i <span class="sy0">!=</span> <span class="nu0">2</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;╠══╪══╪══╬══╪══╪══╬══╪══╪══╣&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;╚══╧══╧══╩══╧══╧══╩══╧══╧══╝&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">void</span> PrintLine<span class="br0">&#40;</span><span class="kw4">int</span> line<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;║&quot;</span> <span class="sy0">+</span> playField<span class="br0">&#91;</span>line, <span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot; │&quot;</span> <span class="sy0">+</span> playField<span class="br0">&#91;</span>line, <span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot; │&quot;</span> <span class="sy0">+</span> playField<span class="br0">&#91;</span>line, <span class="nu0">2</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot; ║&quot;</span> <span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playField<span class="br0">&#91;</span>line, <span class="nu0">3</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot; │&quot;</span> <span class="sy0">+</span> playField<span class="br0">&#91;</span>line, <span class="nu0">4</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot; │&quot;</span> <span class="sy0">+</span> playField<span class="br0">&#91;</span>line, <span class="nu0">5</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot; ║&quot;</span> <span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playField<span class="br0">&#91;</span>line, <span class="nu0">6</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot; │&quot;</span> <span class="sy0">+</span> playField<span class="br0">&#91;</span>line, <span class="nu0">7</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot; │&quot;</span> <span class="sy0">+</span> playField<span class="br0">&#91;</span>line, <span class="nu0">8</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">&quot; ║&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Ранее мне казалось, что составить судоку - просто, бери да заполняй таблицу, следуя правилам. Как оказалось на примере программы - очень часто попадаешь в тупиковую ситуацию, когда таблица заполнена отсилы на половину, ни разу правила не нарушались, а новое число уже вписать нельзя.<br />
Отсюда выходит, что генерация рабочего варианта судоку в зависимости от воли Великого Рандома может занять от нескольких секунд до десятка минут с учётом всех отброшенных &quot;тупиковых&quot; вариантов.<br />
<br />
P.S. Строчку после сообщения о провале генерации можно закомментить, чтобы каждый раз не тыкать на энтер.</div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table>Схоронил, как говорится.</div>

]]></content:encoded>
			<dc:creator>Exerion</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/203150/1323.html</guid>
		</item>
	</channel>
</rss>
