<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dev.net.ua/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">Mike Chaliy's Blog</title><subtitle type="html">Покищо навкруги .Net</subtitle><id>http://dev.net.ua/blogs/mikechaliy/atom.aspx</id><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/default.aspx" /><link rel="self" type="application/atom+xml" href="http://dev.net.ua/blogs/mikechaliy/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.60809.935">Community Server</generator><updated>2008-10-29T11:31:48Z</updated><entry><title>Хочу розвповісти про практичне використання DDD/Rich Moldel</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/09/26/8883.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/09/26/8883.aspx</id><published>2009-09-26T12:48:00Z</published><updated>2009-09-26T12:48:00Z</updated><content type="html">&lt;p&gt;За останні пів року, в мене з’явилась можливість використовувати архітектурні рішення, про які я міг тільки патякати. Мабуть найбільш значущим для мене виявилось Domain Driven Design.  За цей період теоретичне підґрунтя зіткнулось з великою кількістю практичних проблем. Саме про це я і хочу розповісти на UNETA.&lt;/p&gt;

&lt;p&gt;Попередньо планую щось таке:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Дуже-дуже стисло про DDD/Rich Model, так щоб ми спілкувались однією мовою. Наразі я сподіваюсь, що це не знадобиться зовсім;&lt;/li&gt;
&lt;li&gt;Як зберегти Persistence Ignorance використовуючи БД на повну? Як ідентифікувати сутності в таких випадках?&lt;/li&gt;
&lt;li&gt;Як забезпечити валідність моделі?&lt;/li&gt;
&lt;li&gt;Що робити з великими об'єктами та моделями?&lt;/li&gt;
&lt;li&gt;Як робити складні репорти?&lt;/li&gt;
&lt;li&gt;Що робити коли потрібно реалізувати взаємодію між контекстами?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Швидше за все ця доповідь буде цікавою в першу чергу для тих у кого є бажання використовувати DDD. Або навпаки у кого немає бажання. Також буде цікаво розробникам корпоративних додатків. Адже можна впроваджувати окремі практики DDD.&lt;/p&gt;

&lt;p&gt;Якщо є побажання/питання/тощо, прошу в коменти або &lt;a href="mailto:mike@chaliy.name"&gt;поштою&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;До речі, на правах піару. Я тут вирішив практикуватися англійською. А тому в мене з'явився ще один блог. Англійська поки що не дуже, але вже можна хочаб зрозуміти ;), тому не бийте жорстоко. Лінка на блог &lt;a href="http://chaliy.name"&gt;Mike Chaliy (EN)&lt;/a&gt; або &lt;a href="http://feeds.feedburner.com/chaliy"&gt;RSS&lt;/a&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=8883" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="UNETA" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/UNETA/default.aspx" /><category term="DDD" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/DDD/default.aspx" /></entry><entry><title>IronPython - Лінки</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/02/19/7781.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/02/19/7781.aspx</id><published>2009-02-19T14:26:08Z</published><updated>2009-02-19T14:26:08Z</updated><content type="html">&lt;p&gt;&lt;a href="http://status-alexus.blogspot.com/"&gt;Мій колега&lt;/a&gt; опублікував велику кількість лінків стосовно IronPython. Подивитись можна &lt;a href="http://status-alexus.blogspot.com/2009/02/ironpython.html"&gt;тут&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7781" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="IronPhyton" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/IronPhyton/default.aspx" /></entry><entry><title>FxCop(Code Analysis) для нормального кода</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/02/05/7666.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/02/05/7666.aspx</id><published>2009-02-05T10:26:27Z</published><updated>2009-02-05T10:26:27Z</updated><content type="html">&lt;p&gt;Нещодавно я &lt;a href="http://dev.net.ua/blogs/mikechaliy/archive/2009/01/08/7469.aspx"&gt;писав про те що ми врубили&lt;/a&gt; &lt;strong&gt;Code Analysis&lt;/strong&gt;, а сьогодні я розповім про те як ми його вирубили ;).&lt;/p&gt;  &lt;p&gt;Отже, малюнок олією… Ти натискаєш&lt;em&gt; Ctrl+Shift+B (Build Solution)&lt;/em&gt; і йдеш пити чай. Адже Code Analysis включений в білд, це 30-60 секунд на кожен проект, а проектів пару десятків… А я без білдів не можу…&lt;/p&gt;  &lt;h2&gt;Рішення #1, &lt;strong&gt;RunCodeAnalysis&lt;/strong&gt; в &lt;strong&gt;Always&lt;/strong&gt;&lt;/h2&gt;  &lt;p&gt;Ми просто перенесли аналіз на білд сервер(TFS Build Server). Для того щоб це зробити, достатньо в MSBuild скрипті встановити &lt;strong&gt;RunCodeAnalysis&lt;/strong&gt; в &lt;strong&gt;Always&lt;/strong&gt;. Наприклад це можна зробити за допомогою такого кода:&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;RunCodeAnalysis&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Condition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot; '$(RunCodeAnalysis)'=='' &amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Always&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;RunCodeAnalysis&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;А можна і за допомогою аргументу…&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; /p:RunCodeAnalysis=Always&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always&lt;/strong&gt; буде ігнорувати налаштування проекту, і завжди буде робити аналіз коду. А отже тепер за бажанням можна вимкнути аналіз на кожний білд.&lt;/p&gt;

&lt;p&gt;Нижче інші значення &lt;strong&gt;RunCodeAnalysis&lt;/strong&gt;&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="2"&gt;
    &lt;tr&gt;
      &lt;td&gt;Default&lt;/td&gt;

      &lt;td&gt;Це значення по замовчуванню, означає що все залежить від налаштувань кожного проекту.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;Always&lt;/td&gt;

      &lt;td&gt;Буде завжди робити аналіз&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;Never&lt;/td&gt;

      &lt;td&gt;Ніколи…&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;h2&gt;Рішення #2, Локальний перезапис&lt;/h2&gt;

&lt;p&gt;Хоча є ще одне рішення… Воно значно деструктивніше ;), там нам важливий результат. Просто додати юзер оверрайди для проекту..&lt;/p&gt;

&lt;p&gt;Додаємо файл &lt;em&gt;MyProj.csproj.user&lt;/em&gt; з таким вмістом:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;RunCodeAnalysis&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;RunCodeAnalysis&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;І все! На локальній тачці аналіз не запускається, а вже на білд сервері так. Головне перед чекіном на забувати таки зробити аналіз…&lt;/p&gt;

&lt;h2&gt;Рішення #3, Окрема &lt;b&gt;конфігурація&lt;/b&gt;&lt;/h2&gt;

&lt;p&gt;Тримати окрему білд-конфігурацю для білд-серверу. Тобто усі по замовчуванню нічого не аналізують, а спеціальна білд-конфігурація для сервера аналізує. Єдине що мені заважє жити, так це підтримка ще однієї конфігурації…&lt;/p&gt;

&lt;h2&gt;Рішення #4, IsDesktopBuild&lt;/h2&gt;

&lt;p&gt;А можна ще відокремити локальний та серверні білди … &lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; Condition=&amp;quot; '$(IsDesktopBuild)'!='true' &amp;quot;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;Висновок&lt;/h2&gt;

&lt;p&gt;Так чи інакше, а вибір є ;), &lt;strong&gt;швидких вам білдів!&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7666" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="TFS" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/TFS/default.aspx" /><category term="Code Review" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Review/default.aspx" /><category term="Code Analysis" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Analysis/default.aspx" /><category term="FxCop" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/FxCop/default.aspx" /></entry><entry><title>T4 (Visual Studio Text Templates) - Початок</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/02/04/7654.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/02/04/7654.aspx</id><published>2009-02-03T22:23:47Z</published><updated>2009-02-03T22:23:47Z</updated><content type="html">&lt;p&gt;Ненавиджу писати вступні пости, але за роки в мене забралось вже багато інфи про T4, і мені потрібно її якось увіковічити… А для цього потрібен фундамент. Окрім вас мене ніхто читати не буде, тож терпіть…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Text Templates&lt;/strong&gt;, або просто &lt;strong&gt;T4&lt;/strong&gt; – це вбудований в &lt;strong&gt;Visual Studio 2008&lt;/strong&gt; (в 2005 треба окремо встановлювати) &lt;strong&gt;двигун для генерування тексту&lt;/strong&gt;. Виглядає дуже схоже на Asp.NET сторінки. Приблизно так само і працює. Для того щоб розпочати роботу потрібно додати файл з розширенням tt (наразі, можна скористатися вже готовим &lt;a href="http://dev.net.ua/blogs/mikechaliy/archive/2009/02/03/7646.aspx"&gt;темплейтом в студію&lt;/a&gt;). Туди вписати щось на кшталт:&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &amp;lt;#@ template inherits=&lt;span style="color:#006080;"&gt;&amp;quot;Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation&amp;quot;&lt;/span&gt; debug=&lt;span style="color:#006080;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; language=&lt;span style="color:#006080;"&gt;&amp;quot;C#v3.5&amp;quot;&lt;/span&gt; hostspecific=&lt;span style="color:#006080;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; #&amp;gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &amp;lt;#@ assembly Name=&lt;span style="color:#006080;"&gt;&amp;quot;System.Core.dll&amp;quot;&lt;/span&gt; #&amp;gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &amp;lt;#@ output extension=&lt;span style="color:#006080;"&gt;&amp;quot;.cs&amp;quot;&lt;/span&gt; #&amp;gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Test&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoSomething()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         System.Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Generated at {0}&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;&amp;lt;#= DateTime.Now.ToString() #&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Директива &lt;strong&gt;template,&lt;/strong&gt; це щось на кшталт Page а ASP.NET. Там можна вказати базовий клас, мову, тощо. З іншими директивами можна ознайомитись &lt;a title="Directive Syntax (Domain-Specific Languages)" href="http://msdn.microsoft.com/en-us/library/bb126421.aspx"&gt;тут&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Код після директиви &lt;strong&gt;output&lt;/strong&gt;, це і є темплейт, а наприклад конструкція &lt;em&gt;&amp;lt;#= DateTime.Now.ToString() #&amp;gt;&lt;/em&gt; вставить поточну дату в результуючий файл.&lt;/p&gt;

&lt;p&gt;В результаті повинно вийти щось на кшталт:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Test&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoSomething()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;         System.Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Generated at {0}&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;01.02.2009 0:59:35&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Інший приклад генерування за допомогою контролюючих структур:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;height:125px;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &amp;lt;#&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var currentChar &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; []{&lt;span style="color:#006080;"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;,&lt;span style="color:#006080;"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;,&lt;span style="color:#006080;"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;})&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; #&amp;gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;&amp;lt;#= currentChar #&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; &amp;lt;#&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt; #&amp;gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;Так саме як і Page, темплейт генерує код в темп фолдері, а потім його вже компілює. Так само як і з ASP.NET цим можна користатися наприклад для того щоб продивитись результуючий код.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Схоже все.. Тепер це все можна використовувати. Наприклад зараз в мене T4 будує:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Солюшени для SharePoint (маніфест, каб-дефінішен, фітчер) &lt;/li&gt;

  &lt;li&gt;Купу однотипного коду (константи, синтаксичний цукор) &lt;/li&gt;

  &lt;li&gt;DAL (Маппери з IRecord в об’єкти, фасади) &lt;/li&gt;

  &lt;li&gt;Веб-сервіси (Конфігурацію, Контракти) &lt;/li&gt;

  &lt;li&gt;Базу даних (SQL таблиць та в’юх) &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Ресурси&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb126445.aspx"&gt;Generating Artifacts By Using Text Templates&lt;/a&gt; – початкова сторінка на MSDN.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.olegsych.com/tag/t4/"&gt;Oleg Sych&lt;/a&gt; – блог де є що почитати про T4… Наприклад &lt;a href="http://www.olegsych.com/2009/01/pros-and-cons-of-t4-in-visual-studio-2008/"&gt;Pros and Cons of T4 in Visual Studio 2008&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.pnpguidance.net/Tag/T4.aspx"&gt;Категорія T4 на Patterns and Practices Guidance&lt;/a&gt;, теж є що подивитись, особливо на приклади реального використання.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://haacked.com/archive/2009/01/31/t4-templates-in-asp.net-mvc.aspx"&gt;T4 Templates in ASP.NET MVC&lt;/a&gt; – в інтеграція MVC Framework та студії використовує T4 для генерації коду.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/archive/2009/02/03/7646.aspx"&gt;Темплейт в Visual Studio 2008&lt;/a&gt; – простий шаблон.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Далі буде! Веселих вам темплейтів!&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7654" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="T4" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/T4/default.aspx" /></entry><entry><title>Темплейти до темплейтів. T4 (Text Template) Template для Visual Studio 2008</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/02/03/7646.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/02/03/7646.aspx</id><published>2009-02-03T10:41:00Z</published><updated>2009-02-03T10:41:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/image_1F7D027B.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="image" border="0" alt="image" align="right" src="http://dev.net.ua/blogs/mikechaliy/image_thumb_67CCD8FB.png" width="134" height="123" /&gt;&lt;/a&gt;В студії чомусь немає темплейтів для T4… Я вирішив це виправити ;).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.chaliy.name/files/texttemplate/v1_0/TextTemplate.vsi"&gt;Тут&lt;/a&gt; можна скачати інсталлер.&lt;/p&gt;  &lt;p&gt;В інсталлер я запакував один единий темплейт для C# 3.0.&lt;/p&gt;  &lt;p&gt;Якщо потрібен .NET 2.0, то в директиві template в атрибуті language повинен бути просто “C#”.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7646" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="T4" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/T4/default.aspx" /></entry><entry><title>Flow-chart навчання Flow-chart</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/01/24/7591.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/01/24/7591.aspx</id><published>2009-01-24T10:31:44Z</published><updated>2009-01-24T10:31:44Z</updated><content type="html">&lt;p&gt;Це треба бачити - &lt;a title="http://xkcd.com/518/" href="http://xkcd.com/518/"&gt;http://xkcd.com/518/&lt;/a&gt;. Діаграма навчає діаграмі!&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7591" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Fun" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Fun/default.aspx" /><category term="Workflow" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Workflow/default.aspx" /></entry><entry><title>Чому мені сподобався F#...</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/01/18/7523.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/01/18/7523.aspx</id><published>2009-01-18T14:30:56Z</published><updated>2009-01-18T14:30:56Z</updated><content type="html">&lt;p&gt;В мене відпустка, і я вирішив зблизька подивитись на функціональні та динамічні мови. Отже далі про функціональну мову від Microsoft – &lt;a href="http://en.wikipedia.org/wiki/F_Sharp_(programming_language)"&gt;F#&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Що мені сподобалось&lt;/h2&gt;  &lt;p&gt;1) Референс типи без null.&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; type Person{FullName:&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;}&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; let AcceptPerson p&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     pringfn p.FullName &lt;span style="color:#008000;"&gt;// А тут не потрібно первіряти p на null&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; AcceptPerson(&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) // Таке не можливо&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Тобто якщо викликати AcceptPerson з C# то туди можна закинути null. Але в середовищі F# все чудово, компілятор почне лаятись.&lt;/p&gt;

&lt;p&gt;Нажаль тут є проблема. F# використовує System.String. А тому FullName таки може бути null.&lt;/p&gt;

&lt;p&gt;2) “Безпомилкова” обрабока “enum-ів”. Насамперед це не енуми, це прості класи, але з чіткою ієрархією – це я про “union type”&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; type Content =&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; | Html&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; | Text&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; | Binary&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Цей запис означає що у типу Content може бути тільки три значення. Якщо спробувати обробити його за допомогою аналога (в цьому випадку) switch-а, то отримаємо таке попередження:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Incomplete pattern matches on this expression. For example, the value 'Binnary' will not be matched”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/image_41044902.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Incomplete pattern matches on this expression. For example, the value &amp;#39;Binnary&amp;#39; will not be matched." border="0" alt="Incomplete pattern matches on this expression. For example, the value &amp;#39;Binnary&amp;#39; will not be matched." src="http://dev.net.ua/blogs/mikechaliy/image_thumb_3DF1EB0D.png" width="232" height="87" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;3) А як вам таке?&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; type Content =&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; | Html of &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; | Text of &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; | Binnary of &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[]&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Це означає що кожен зі значень може приймати те ще написано після of…&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; let ToString c =&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     match c with&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     | Html s -&amp;gt; StripTags(s)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     | Text s -&amp;gt; s&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     | Binnary b -&amp;gt; BytesToString(b)&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;А це як воно може оброблятися.&lt;/p&gt;

&lt;p&gt;4) А як мінімалістично можна задавати типи…&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; type Person = {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     FullName: &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     Email: &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;З точки зору CLR це повний тип, з проперятями, з конструктором, з компаратором і незмінний. Майже ані, крапки зайвого коду!&lt;/p&gt;

&lt;p&gt;5) Вивід типів… &lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; let BuildMe() = {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     FullName = &lt;span style="color:#006080;"&gt;&amp;quot;Mike Chaliy&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     Email = &lt;span style="color:#006080;"&gt;&amp;quot;mike@chaliy.name&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Зауважте що тут жодного типу. Але ж F# повністю(маніакально) типізована мова. Компілер все робить самотужки.&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; Person BuildMe()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Person(&lt;span style="color:#006080;"&gt;&amp;quot;Mike Chaliy&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;mike@chaliy.name&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Це щось на кшталт var в C#, але значно потужніший, наприклад по коду він зрозумів що мені потрібен Person.&lt;/p&gt;

&lt;p&gt;6) Матчінг. В порівнянні C# switch, конструкція match в F# може робити дива. По-перше, як я вже і казав, match перевіряє правильність. По-друге, переходи можна робити за складними матчінгом.&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; let ToString2 c =&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     match c with&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     | Html s when s.StartsWith(&lt;span style="color:#006080;"&gt;&amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;/span&gt;) -&amp;gt; StripTags(s)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     | Html s -&amp;gt; StripTags(s)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     | _&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Тобто перша гілка піде для тих Html які починаються з “&amp;lt;html&amp;gt;”, а друга для всіх інших.&lt;/p&gt;

&lt;p&gt;7) Функції, вони тут об’єкти першого класу, а отже можуть бути аргументами, полями, тощо..&lt;/p&gt;

&lt;h2&gt;Ну і в інший бік, що мені не сподобалось&lt;/h2&gt;

&lt;p&gt;1) Як я вже казав рядки. Вони можуть бути null. Я для цього просто написав свою реалізацію рядка.&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; JustString s1 = &lt;span style="color:#006080;"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;; &lt;span style="color:#008000;"&gt;// JustString не може бути null&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; s2 = s1;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; Console.WriteLine(s2 == s1);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Я вже зробив проект на CodePlex за декілька днів пробалішу.&lt;/p&gt;

&lt;p&gt;2) Компіляція залежить від порядку файлів. Тут два рішення, або в файлі проекту руками сортувати, або використовувати файли дефенішени (щось на кшталт h файлів в С++) – fsi.&lt;/p&gt;

&lt;p&gt;3) Нема підтримки папок в студії.&lt;/p&gt;

&lt;p&gt;4) Дуже слабка підтримка студії. Тут і відсутність темплейтів, і рефакторінгів, і дизайнерів.&lt;/p&gt;

&lt;p&gt;5) В угоду сумісності з OCaml залишаються артефакти які нікому не потрібні, наприклад директива light#.&lt;/p&gt;

&lt;p&gt;6) Поки що проблеми з іменами базової бібліотеки. Так тут можна знайти zero_create, exists2, FromList – тобто в бібліотеці можна знайти і камл, і паскаль, і підкремелння, і нові версії функцій з номерами… Певне більшість такого зроблено для сумісності, але ж!&lt;/p&gt;

&lt;p&gt;7) Немає неявного кастінгу інтерфейсів. Тобто якщо у вас є функція яка повертає інтерфейс, і клас який цей інтерфейс реалізовує, то вам все одно потрібно зробити кастінг в інтерфейс.&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; let Create() =&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Implemenation.DefaultBlogManager() :&amp;gt; IBlogManager&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     // тут ми DefaultBlogManager закастили к IBlogManager&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;8) Поки що мало прикладів. З цим можна жити, але тяжко ;).&lt;/p&gt;

&lt;h2&gt;Висновок&lt;/h2&gt;

&lt;p&gt;Класний мінімалістичний язик, для того щоб він став читабельним потрібно тренуватися. Перше враження – місиво незрозумілих команд, потім - лаконічний струмок. Дозволяє дуже сильно спростити валідацю коду.&lt;/p&gt;

&lt;h2&gt;Ресурси&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec2.aspx"&gt;The F# 1.9.6 Draft Language Specification&lt;/a&gt; – добре написана спека, я не знаю чи складно її використовувати для того щоб написати F#, а ось для щоб вивчати вона просто супер.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cs.hubfs.net/"&gt;hubFS: THE place for F#&lt;/a&gt; – F# комуніті, дуже жвавий форм, відповідають одразу, там же тусуються і розробники.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://search.live.com/results.aspx?q=F%23&amp;amp;mkt=en-US"&gt;Пошук по F#&lt;/a&gt; – наразі вже купа статей, книг, блогів..&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7523" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Code" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code/default.aspx" /><category term="Functional Language" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Functional+Language/default.aspx" /><category term="F#" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/F_2300_/default.aspx" /></entry><entry><title>FxCop(Code Analysis) для Legacy кода</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/01/08/7469.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/01/08/7469.aspx</id><published>2009-01-08T09:13:46Z</published><updated>2009-01-08T09:13:46Z</updated><content type="html">&lt;p&gt;Нещодавно ми вирішили що нам потрібен Code Analysis. У нас є база з декількох десятків тисяч рядків коду яку ми підтримуємо, але активно не розробляємо. Код писався декілька років тому, і Code Analysis репортить майже стільки проблем скільки рядків коду. Фіксити усі ті тисячі попереджень, немає ні часу ні бажання, єдине чого кортить це перевірка в новому коді.&lt;/p&gt;  &lt;p&gt;Перше що спадає на думку це повимикати усі неугодні рули. Але проблема в тому що і на новий код це діяти не буде! Більше того воно не буде діяти навіть коли ріками викликати Run Code Analyse! Як то кажуть “ф топку!” таке рішення.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Коротка версія&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Зупинились на “тимчасовому” “придушенні” попереджень. Тобто виділили усі попередження, і зробили їм Suppress Message(s)/In ProjectSuppression File.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right-width:0px;margin:10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Suppress Message(s)/In ProjectSuppression File" border="0" alt="Suppress Message(s)/In ProjectSuppression File" src="http://dev.net.ua/blogs/mikechaliy/image_0253E3FF.png" width="593" height="145" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Повна версія&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Отже, почали ми з того, що спробували пофіксити глобальні проблеми, ті які викликають більшу частину усіх попереджень. В нашому випадку це були назви неймспейсів, назви елементів нашого домену. Просто додали CustomDictionary.xml.&lt;/p&gt;  &lt;p&gt;Потім Suppress Message(s)/In ProjectSuppression File для всіх попереджень.&lt;/p&gt;  &lt;p&gt;І на при кінці, перейменували GlobalSuppressions.cs в GlobalSuppressionsTemp.cs, цим ми відокремили ті попередження які ми поки що не хочемо вирішувати, і ті які ми і справді будемо додавати для нового коду.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Проблеми&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Перша проблема це те ще неможливо виділити більше за 200 попереджень. Ми цю проблему не вирішували. Але щось мені підказує що це не проблема трансформувати результати FxCop(це простий XML) в такий собі кастомний GlobalSuppressions.cs.&lt;/p&gt;  &lt;p&gt;Друга проблема це рефакторінг. За рахунок того що “придушення” в файлі проекту, зрозуміло що навіть перейменування,призводить до того що “придушення” стають не актуальні. З цією проблемою ми боремось двома шляхами. Або просто додаємо “придушуємо” нові попередження, або фіксимо.&lt;/p&gt;  &lt;p&gt;Третя проблема, це застарілі “придушення”. Але у нас поки що їх не так вже і багато… Так чи інакше ми це ще не вирішили.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7469" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Code Review" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Review/default.aspx" /><category term="Code Analysis" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Analysis/default.aspx" /><category term="FxCop" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/FxCop/default.aspx" /><category term="Legacy Code" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Legacy+Code/default.aspx" /></entry><entry><title>LINQ для об’єктної моделі SharePoint, або інших IDisposable об’єктів</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/01/05/7448.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/01/05/7448.aspx</id><published>2009-01-05T12:05:08Z</published><updated>2009-01-05T12:05:08Z</updated><content type="html">&lt;p&gt;Об’єктна модель SharePoint більш-менш ієрархічна. Тобто є Web Application а в ньому Site-и, у сайта – Web-и, у веба - List-и, тощо. Так вже виходить, що не рідко з’являється потреба по цій ієрархії бігати. Ось невеличкий приклад, пошуку потрібного Event Receiver-у.&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (SPSite site &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; GetApplicationByUrl(&lt;span style="color:#006080;"&gt;&amp;quot;http://test/&amp;quot;&lt;/span&gt;).Sites){&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (site){&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (SPWeb web &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; site.AllWebs){&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (web){&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (SPList list &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; web.Lists){&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;                     &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (SPEventReceiverDefinition eventReceiver &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; list.EventReceivers)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;                     {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;                         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (eventReceiver.Assembly == &lt;span style="color:#006080;"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;                             &amp;amp;&amp;amp; eventReceiver.Class == &lt;span style="color:#006080;"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;                         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;                             Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Site: {0}; Web: {1}; List: {2}; Receiver: {3}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;                                               site.Url, web.Name, list.Title, eventReceiver.Class);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;                         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;                     }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;                 }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;             }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;     }            &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Бридко! Читати не реально. Розбити на декілька методів, теж не реально. І це я повикидав чи не половину перевірок! В реальному житті там був просто жах!&lt;/p&gt;

&lt;p&gt;Ось в таких випадках і може згодитися LINQ, дивіться:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; var results = from site &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; GetApplicationByUrl(&lt;span style="color:#006080;"&gt;&amp;quot;http://test/&amp;quot;&lt;/span&gt;).Sites.Cast&amp;lt;SPSite&amp;gt;()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;               from web &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; site.AllWebs.Cast&amp;lt;SPWeb&amp;gt;()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;               from list &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; web.Lists.Cast&amp;lt;SPList&amp;gt;()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;               from eventReceiver &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; list.EventReceivers.Cast&amp;lt;SPEventReceiverDefinition&amp;gt;()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;               &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; eventReceiver.Assembly == &lt;span style="color:#006080;"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;                     &amp;amp;&amp;amp; eventReceiver.Class == &lt;span style="color:#006080;"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;               select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;                          {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;                              SiteUrl = site.Url,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;                              WebName = web.Name,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;                              ListTitle = list.Title,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;                              ReceiverClass = eventReceiver.Class&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;                          };&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var result &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; results)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;     Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Site: {0}; Web: {1}; List: {2}; Receiver: {3}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;         result.SiteUrl, result.WebName, result.ListTitle, result.ReceiverClass);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Той самий функціонал, але значно читабільніше!&lt;/p&gt;

&lt;p&gt;Але тут виникає інша проблема, в SharePoint майже вся об’єктна модель це обгортка навколо COM, та що тут скажеш, великих COM об’єктів. Єдина можливість з цим жити це IDisposable… Нажаль IDisposable не дуже вкладається в рамки LINQ. Ось я і вирішив це виправити.&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; SPWebApplication webApplication = GetApplicationByUrl(&lt;span style="color:#006080;"&gt;&amp;quot;http://test/&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; var results = from site &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; webApplication.Sites.Cast&amp;lt;SPSite&amp;gt;()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;               from web &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; site.WithDisposabler(site.AllWebs.Cast&amp;lt;SPWeb&amp;gt;()) &lt;font color="#008000"&gt;// &amp;lt;- Зміна тут&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;               from list &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; site.WithDisposabler(web.Lists.Cast&amp;lt;SPList&amp;gt;()) &lt;font color="#008000"&gt;// &amp;lt;- та тут&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;               from eventReceiver &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; list.EventReceivers.Cast&amp;lt;SPEventReceiverDefinition&amp;gt;()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;               &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; eventReceiver.Assembly == &lt;span style="color:#006080;"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;                     &amp;amp;&amp;amp; eventReceiver.Class == &lt;span style="color:#006080;"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;               select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;               {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;                   SiteUrl = site.Url,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;                   WebName = web.Name,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;                   ListTitle = list.Title,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;                   ReceiverClass = eventReceiver.Class&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;               };&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var result &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; results)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;     Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Site: {0}; Web: {1}; List: {2}; Receiver: {3}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;         result.SiteUrl, result.WebName, result.ListTitle, result.ReceiverClass);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Додався маджік з WithDisposabler. Це невеличкий метод-“розширення” який огортає IEnumerable дргугого аргументу в спеціальний адаптер для IEnumerable&amp;lt;T&amp;gt; та IEnumerator&amp;lt;T&amp;gt;, який, в свою чергу, просто викликає метод Dispose у першого аргументу. В нашому випадку це і є ота обгортка над COM.&lt;/p&gt;

&lt;p&gt;Код методу WithDisposabler.&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;height:500px;max-height:600px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; EnumerableExtensions&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; IEnumerable&amp;lt;TItem&amp;gt; WithDisposabler&amp;lt;TItem&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; IDisposable disposable, IEnumerable&amp;lt;TItem&amp;gt; items)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (disposable == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#006080;"&gt;&amp;quot;disposable&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (items == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#006080;"&gt;&amp;quot;items&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DisposableEnumerable&amp;lt;TItem&amp;gt;(disposable, items);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; DisposableEnumerator&amp;lt;TItem&amp;gt; : IEnumerator&amp;lt;TItem&amp;gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; IDisposable disposable;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; IEnumerator&amp;lt;TItem&amp;gt; items;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DisposableEnumerator(IDisposable disposable, IEnumerator&amp;lt;TItem&amp;gt; items)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.disposable = disposable;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.items = items;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;p&gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.items.Dispose();&lt;/p&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.disposable.Dispose();&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; MoveNext()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.items.MoveNext();&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Reset()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  41:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  42:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.items.Reset();                &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  43:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  44:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  45:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; TItem Current&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  46:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  47:&lt;/span&gt;             get&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  48:&lt;/span&gt;             {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  49:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.items.Current;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  50:&lt;/span&gt;             }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  51:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  52:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  53:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; IEnumerator.Current&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  54:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  55:&lt;/span&gt;             get&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  56:&lt;/span&gt;             {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  57:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; Current;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  58:&lt;/span&gt;             }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  59:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  60:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  61:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  62:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; DisposableEnumerable&amp;lt;TItem&amp;gt; : IEnumerable&amp;lt;TItem&amp;gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  63:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  64:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  65:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; IDisposable disposable;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  66:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; IEnumerable&amp;lt;TItem&amp;gt; items;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  67:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  68:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DisposableEnumerable(IDisposable disposable, IEnumerable&amp;lt;TItem&amp;gt; items)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  69:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  70:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.disposable = disposable;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  71:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.items = items;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  72:&lt;/span&gt;         }          &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  73:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  74:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IEnumerator&amp;lt;TItem&amp;gt; GetEnumerator()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  75:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  76:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DisposableEnumerator&amp;lt;TItem&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.disposable, items.GetEnumerator());&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  77:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  78:&lt;/span&gt;         &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  79:&lt;/span&gt;         IEnumerator IEnumerable.GetEnumerator()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  80:&lt;/span&gt;         {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  81:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.GetEnumerator();&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  82:&lt;/span&gt;         }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  83:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  84:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Щось схоже пішло в продакшен. Подивимось!&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7448" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Linq" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Linq/default.aspx" /><category term="SharePoint" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/SharePoint/default.aspx" /><category term="Code" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code/default.aspx" /><category term="Code Readability" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code+Readability/default.aspx" /><category term="WSS" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/WSS/default.aspx" /></entry><entry><title>Чи хто знає що там робить ReSharper?</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/01/04/7439.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/01/04/7439.aspx</id><published>2009-01-04T17:35:42Z</published><updated>2009-01-04T17:35:42Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.microsoft.com/visualstudio/products/2010/default.mspx"&gt;Головна сторінка Microsoft® Visual Studio® 2010&lt;/a&gt;…&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Microsoft® Visual Studio® 2010" border="0" alt="Microsoft® Visual Studio® 2010" src="http://dev.net.ua/blogs/mikechaliy/image_77A21E2C.png" width="533" height="292" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Перше віконце – це віконце опцій ReSharper-а! Це вони мабуть знущаються з JetBrains, зробили новий редактор, а команді ReSharper тепер все переробляти ;).&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7439" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Fun" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Fun/default.aspx" /></entry><entry><title>Плагіни для коду для Windows Live Writer</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2009/01/04/7437.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2009/01/04/7437.aspx</id><published>2009-01-04T16:25:16Z</published><updated>2009-01-04T16:25:16Z</updated><content type="html">&lt;p&gt;Я тут вирішив щось зробити з постінгом коду. Тобто пошукати якийсь плагін для “розкольоровування” коду. Виявилось що таких з десяток. Чи то в мене часу забагато, чи ще щось, але я усіх їх продивився. Ось найкращі результати моїх пошуків.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=d4409446-af7f-42ec-aa20-78aa5bac4748&amp;amp;bt=9&amp;amp;pl=8"&gt;&lt;strong&gt;Code Snippet plugin for Windows Live Writer&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Від інших відрізняється тим що:&lt;/p&gt;  &lt;p&gt;1) є режим в якому тулза не питає, а просто перевикористовує останні налаштування (хоча складається враження, що в мене це не працює);&lt;/p&gt;  &lt;p&gt;2) є підтримка корегування відступів, Ctrl+Tab та Ctrl+Shift+Tab;&lt;/p&gt;  &lt;p&gt;3) є два режими стилів, перший прямо вбудований, а другий коли ці стилі вбудовані в головний стиль блога.&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:94.51%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;height:105px;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; from eventReceiver &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; list.EventReceivers.Cast&amp;lt;SPEventReceiverDefinition&amp;gt;()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; eventReceiver.Assembly == &lt;span style="color:#006080;"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &amp;amp;&amp;amp; eventReceiver.Class == &lt;span style="color:#006080;"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; select eventReceiver&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Нажаль підтримує мало мов. Наприклад немає XML. Також я так і не знайшов як відредагувати вже вставлений код.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=10d724ab-0d28-4c78-8310-a6e2cfdef891&amp;amp;bt=9&amp;amp;pl=8"&gt;&lt;strong&gt;Source Code Formatter&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Єдиний плюс цієї тулзи це підтримка XML, та ще десятка мов, про які я навіть не чув…&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:417px;padding-right:5px;height:149px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  1: from eventReceiver &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; list.EventReceivers.Cast&amp;lt;SPEventReceiverDefinition&amp;gt;()
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  2: where eventReceiver.Assembly == &amp;quot;&lt;span style="color:#8b0000;"&gt;Test&lt;/span&gt;&amp;quot;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  3:      &amp;amp;&amp;amp; eventReceiver.Class == &amp;quot;&lt;span style="color:#8b0000;"&gt;Test&lt;/span&gt;&amp;quot;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,'Courier New',courier,monospace;font-size:12px;"&gt;  4: select eventReceiver.Class&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9&amp;amp;bt=9&amp;amp;pl=8"&gt;&lt;strong&gt;Paste from Visual Studio&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Класна тулза. Вона просто бере HTML який генерує студія, огортає в pre і все. Ніяких питань. Додаткова цікава фішка, це автоматичне прибирання непотрібних табів. Прикольно також, що на відміну від попередніх, вона дозволяє редагувати код.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;from &lt;/span&gt;eventReceiver &lt;span style="color:blue;"&gt;in &lt;/span&gt;list.EventReceivers.Cast&amp;lt;&lt;span style="color:#2b91af;"&gt;SPEventReceiverDefinition&lt;/span&gt;&amp;gt;()
&lt;span style="color:blue;"&gt;where &lt;/span&gt;eventReceiver.Assembly == &lt;span style="color:#a31515;"&gt;&amp;quot;Test&amp;quot;
      &lt;/span&gt;&amp;amp;&amp;amp; eventReceiver.Class == &lt;span style="color:#a31515;"&gt;&amp;quot;Test&amp;quot;
&lt;/span&gt;&lt;span style="color:blue;"&gt;select &lt;/span&gt;eventReceiver&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;strong&gt;Висновок&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;В мене поки що залишаються &lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=d4409446-af7f-42ec-aa20-78aa5bac4748&amp;amp;bt=9&amp;amp;pl=8"&gt;Code Snippet plugin for Windows Live Writer&lt;/a&gt; та &lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9&amp;amp;bt=9&amp;amp;pl=8"&gt;Paste from Visual Studio&lt;/a&gt;. Насправді, жодна з них не надає можливості легко копіювати код для читачів та легко редагувати код для авторів. Так чи інакше подивимось.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7437" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Live Writer" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Live+Writer/default.aspx" /><category term="Code" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Code/default.aspx" /></entry><entry><title>Набридло чекати Visual Studio на проектах з Тестами?</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/12/31/7428.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/12/31/7428.aspx</id><published>2008-12-31T10:45:34Z</published><updated>2008-12-31T10:45:34Z</updated><content type="html">&lt;p&gt;Мабуть хтось вже стикався з тим що коли в Solution Explorer тицнути на проект з тестами, то Visual Studio приєднуєтся до розшуку &lt;a href="http://setiathome.berkeley.edu/"&gt;позаземного життя&lt;/a&gt; і повертається до тями тілки за декілька секунд? Виявилось що цей код розташовано в тулбарі з назвою Test Tools.&lt;/p&gt;  &lt;p&gt;Вирішується просто &lt;/p&gt;  &lt;p&gt;1) Від’єднати від тулбара&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/mikechaliy/image_401B9713.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://dev.net.ua/blogs/mikechaliy/image_thumb_11586F22.png" width="349" height="70" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;тоді затримка буде, але невеличка.&lt;/p&gt;  &lt;p&gt;2) Або просто ввимкнути, тоді затримки зовсім не буде…&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Приємного Нового Року! Та менше гальмівних проектів!&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7428" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Visual Studio" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Visual+Studio/default.aspx" /><category term="Tip" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Tip/default.aspx" /><category term="Visual Studio Tips" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Visual+Studio+Tips/default.aspx" /></entry><entry><title>Я їду на “Платформа 2009”</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/11/28/7226.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/11/28/7226.aspx</id><published>2008-11-28T11:23:57Z</published><updated>2008-11-28T11:23:57Z</updated><content type="html">&lt;p&gt;Дякуючи Майкрософт Україна та ГлобалЛоджік, я їду на &lt;a href="http://platforma2009.ru/"&gt;“Платформу 2009”&lt;/a&gt;. Якщо хтось теж їде, кажіть - зустрінемось! &lt;/p&gt;  &lt;p&gt;А ось мій розклад, майже кожного разу в мене на один час більше двох сесій. Вже на місці буду дивитись де цікавіше.&lt;/p&gt;  &lt;table style="border-collapse:collapse;" cellspacing="0" cellpadding="8"&gt;     &lt;tr&gt;       &lt;th class="dayTH"&gt;04 декабря&lt;/th&gt;     &lt;/tr&gt;        &lt;tr&gt;       &lt;td class="timeTD"&gt;08:00-          &lt;br /&gt;10:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Регистрация          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;10:00-          &lt;br /&gt;12:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Открытие конференции. Пленарный доклад (Большой зал).          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;12:00-          &lt;br /&gt;13:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Обед          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;13:30-          &lt;br /&gt;14:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DB 201          &lt;br /&gt;&lt;b&gt;SQL Server 2008 единым взглядом&lt;/b&gt;           &lt;br /&gt;Место: Большой зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;13:30-          &lt;br /&gt;14:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 201          &lt;br /&gt;&lt;b&gt;Claim-based identity: обзор технологий &amp;quot;Geneva&amp;quot;&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:30-          &lt;br /&gt;15:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;15:00-          &lt;br /&gt;16:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DT 201          &lt;br /&gt;&lt;b&gt;Платформа Microsoft Windows Embedded: новые возможности для Ваших проектов&lt;/b&gt;           &lt;br /&gt;Место: Красный зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:00-          &lt;br /&gt;16:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:30-          &lt;br /&gt;17:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 203          &lt;br /&gt;&lt;b&gt;Обзор перспектив прикладной платформы Microsoft&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:30-          &lt;br /&gt;17:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DB 302          &lt;br /&gt;&lt;b&gt;Миграция на SQL Server 2008 с предыдущих версий&lt;/b&gt;           &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;17:30-          &lt;br /&gt;18:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;18:00-          &lt;br /&gt;19:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 204          &lt;br /&gt;&lt;b&gt;Архитектура приложений на платформе .NET теперь в стиле Софт + Сервисы&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;18:00-          &lt;br /&gt;19:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DT 204          &lt;br /&gt;&lt;b&gt;Как написать полноценное бизнес приложение на Windows Mobile&lt;/b&gt;           &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;19:00-          &lt;br /&gt;19:15&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;19:15-          &lt;br /&gt;20:15&lt;/td&gt;        &lt;td class="nameTD"&gt;Круглый стол: RN 204          &lt;br /&gt;&lt;b&gt;Платформа Microsoft - эволюция в облако. Изменит ли реализация S+S стратегии мир?&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;19:15-          &lt;br /&gt;20:15&lt;/td&gt;        &lt;td class="nameTD"&gt;Круглый стол: RN 205          &lt;br /&gt;&lt;b&gt;Виртуализация 360&lt;/b&gt;           &lt;br /&gt;Место: Большой зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;19:15-          &lt;br /&gt;20:15&lt;/td&gt;        &lt;td class="nameTD"&gt;Вечерняя программа          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="font-size:xx-small;" colspan="2"&gt;&amp;#160;&lt;/td&gt; &lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;       &lt;th class="dayTH"&gt;05 декабря&lt;/th&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;09:00-          &lt;br /&gt;09:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;09:30-          &lt;br /&gt;10:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: IS 303          &lt;br /&gt;&lt;b&gt;Безопасный обмен данными между организациями с использованием Active Directory Rights Management Services и Active Directory Federation Services&lt;/b&gt;           &lt;br /&gt;Место: Бежевый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;09:30-          &lt;br /&gt;10:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 205          &lt;br /&gt;&lt;b&gt;Обзор сервисной платформы Microsoft Azure &lt;/b&gt;          &lt;br /&gt;Место: Большой зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;09:30-          &lt;br /&gt;10:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DT 405          &lt;br /&gt;&lt;b&gt;Функциональное программирование и параллельные вычисления – новые возможности для разработчиков в .NET: Task Parallel Library и PLINQ&lt;/b&gt;           &lt;br /&gt;Место: Красный зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;10:30-          &lt;br /&gt;11:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;11:00-          &lt;br /&gt;12:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 206          &lt;br /&gt;&lt;b&gt;Первый взгляд на Oslo, Dublin и Workflow Foundation 4.0&lt;/b&gt;           &lt;br /&gt;Место: Большой зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;11:00-          &lt;br /&gt;12:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: OS 202          &lt;br /&gt;&lt;b&gt;Windows – как создается операционная система&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;11:00-          &lt;br /&gt;12:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DB 303          &lt;br /&gt;&lt;b&gt;SQL Server 2008: полный контроль над информацией &lt;/b&gt;          &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;12:00-          &lt;br /&gt;13:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Обед          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;13:00-          &lt;br /&gt;14:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: DT 207          &lt;br /&gt;&lt;b&gt;Windows Azure: Разработка для облака&lt;/b&gt;           &lt;br /&gt;Место: Красный зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:00-          &lt;br /&gt;14:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:30-          &lt;br /&gt;15:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: AR 107          &lt;br /&gt;&lt;b&gt;Внедрение решений Enterprise Project Management: взгляд бизнес-архитектора&lt;/b&gt;           &lt;br /&gt;Место: Бежевый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:30-          &lt;br /&gt;15:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: IT 211          &lt;br /&gt;&lt;b&gt;Как Microsoft Consulting Services делает крупные инфраструктурные проекты. Уникальные технологии, средства автоматизации, и практические наработки.&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;14:30-          &lt;br /&gt;15:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: BI 202          &lt;br /&gt;&lt;b&gt;Обзор SQL Server Analysis Services 2008&lt;/b&gt;           &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;15:30-          &lt;br /&gt;16:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:00-          &lt;br /&gt;17:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: PS 202          &lt;br /&gt;&lt;b&gt;Проектирование решений для SharePoint Server 2007&lt;/b&gt;           &lt;br /&gt;Место: Желтый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;16:00-          &lt;br /&gt;17:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: BI 303          &lt;br /&gt;&lt;b&gt;Бизнес-аналитика и моделирование в SQL Server 2010 Analysis Services&lt;/b&gt;           &lt;br /&gt;Место: Зеленый зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;17:00-          &lt;br /&gt;17:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;17:30-          &lt;br /&gt;18:30&lt;/td&gt;        &lt;td class="nameTD"&gt;Доклад: UC 202          &lt;br /&gt;&lt;b&gt;Новый виток эволюции в объединенных коммуникациях. Office Communication Server 2007 R2&lt;/b&gt;           &lt;br /&gt;Место: Синий зал &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;18:30-          &lt;br /&gt;18:45&lt;/td&gt;        &lt;td class="nameTD"&gt;Перерыв          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td class="timeTD"&gt;18:45-          &lt;br /&gt;20:00&lt;/td&gt;        &lt;td class="nameTD"&gt;Закрытие конференции (Большой зал).          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7226" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Microsoft" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Microsoft/default.aspx" /></entry><entry><title>CSV у якості DataSource</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/10/29/7095.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/10/29/7095.aspx</id><published>2008-10-29T09:43:25Z</published><updated>2008-10-29T09:43:25Z</updated><content type="html">&lt;p&gt;Для Data-Driven тестів я завжди використовував Excel, легко редагувати, легко під’єднати, тощо. Десь з тиждень назад розпочалась нова ера мого життя ;), мій дев лід вказав на старе як мир правило.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Будь який код повинен версіонуватися!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Все просто. По-перше, в тексті найменша зміна яка піддається діфам та мержам це один символ. В бінарному файлі, тільки сам файл. По-друге, для Data-Driven тестів, Дата це код.&lt;/p&gt;  &lt;p&gt;Ну і добре! Принаймні два рішення. Перше це XML, а друге CSV. XML я одразу відкинув, купа сміття усі ті теги та атрибути. Для табулярних даних це просто оверкіл. Отже CSV.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Головне правило для роботи з MSTest Data-Driven тестами.&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Якщо тест каже піти подивитись Troubleshooting Data-Driven Unit Tests, це треба зробити.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;Наприклад я ніколи не читаю щось де є слово Troubleshooting. А тому я витратив декілька годин, на дебаггінг студії, ODBC провайдера, пошуку в інеті, тощо.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;На сторінці &lt;a href="http://msdn.microsoft.com/en-us/library/ms404700(VS.80).aspx"&gt;Troubleshooting Data-Driven Unit Tests&lt;/a&gt; можна знайти нормальні рядки під’єднання, з деякими подробицями. Наприклад:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties=&amp;quot;text;HDR=Yes;FMT=Delimited”&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Tip&lt;/b&gt;&amp;#160;&amp;#160;&amp;#160; For the test.csv file, use test#csv as the table name.&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Note&lt;/b&gt;&amp;#160;&amp;#160; HDR=Yes means that the first row contains column names, not actual data.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Отже правила.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;1) Крапка в назві файлу повинна бути замінена на “#”. Інше рішення це зовсім прибрати розширення, але реальний файл тоді повинен мати розширення “.txt”.&lt;/p&gt;  &lt;p&gt;2) CSV файли повинні бути в окремій папці. Я на 100% не розумію проблему, але схоже що, з якогось переляку, драйвер перебирає усі файли, і валиться якщо йому щось не зрозуміло.&lt;/p&gt;  &lt;p&gt;3) CSV файлу начхати на формат в якому ви туди щось запишете, але тести працювати не будуть якщо колонки не будуть текстовими. Я знаю два шляхи, якийсь там inf файл в директорію. Але це складно. Другий просто всі значення огортати лапками. Останнє стовідсотково працює.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Приклад тесту&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;   &lt;br /&gt;[TestMethod]    &lt;br /&gt;[DataSource(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"System.Data.OleDb"&lt;/span&gt;,     &lt;br /&gt;            &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\Data\\;Extended Properties=\"text;HDR=Yes;FMT=Delimited\""&lt;/span&gt;,     &lt;br /&gt;            &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"ValidPostalCodes#csv"&lt;/span&gt;, DataAccessMethod.Sequential)]     &lt;br /&gt;[DeploymentItem(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"\\UnitTests\\Data\\ValidPostalCodes.csv"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Data"&lt;/span&gt;)]     &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; Validator_Should_Accept_Example_Postal_Code()   &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Приклад файлу&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;   &lt;br /&gt;PostalCode,Comment    &lt;br /&gt;&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"1555-1899"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"We allow dashes"&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"184878848"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"9 Digts is maximum"&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"1"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"1 digist is also valid postal code"&lt;/span&gt;  &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7095" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Unit Testing" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Unit+Testing/default.aspx" /><category term="Data-Driven Unit Testing" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Data-Driven+Unit+Testing/default.aspx" /></entry><entry><title>MEF використовується тут…</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/10/29/7092.aspx" /><id>http://dev.net.ua/blogs/mikechaliy/archive/2008/10/29/7092.aspx</id><published>2008-10-29T08:31:48Z</published><updated>2008-10-29T08:31:48Z</updated><content type="html">&lt;p&gt;Цікава особливість останніх новин. Деякі нові анонсовані продукти використовують &lt;a href="http://code.msdn.microsoft.com/mef"&gt;Managed Extensibility Framework&lt;/a&gt;..&lt;/p&gt;  &lt;p&gt;1) “&lt;a href="http://weblogs.asp.net/israelio/archive/2008/10/28/pdc08-scott-gu.aspx"&gt;New WPF source Editor - based on MEF e.g. you can add new features to the editor&lt;/a&gt;”. В мене зараз студія 2010 в даунлодах, завтра розповім як воно виглядає. По скріншотам схоже на перші версії бленда.&lt;/p&gt;  &lt;p&gt;2) “&lt;a href="http://www.simplegeek.com/"&gt;but I can say that MEF is absolutely core to our text editing tool for Oslo&lt;/a&gt;”, це я вже первірив, 100% використовується, до речі цей Emacs.Net виглядає дуже класно.&lt;/p&gt;  &lt;p&gt;3) Також MEF використовується в інших компонентах Oslo, наприклад парсер “M”. Хоча швидкий пошук так і не дав відповіді що саме вони там використовують.&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Деякі питання що виникали на останній UNETA та відповіді на них.&lt;/p&gt;  &lt;p&gt;1) &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/MEFramework/thread/c66f561d-1047-4770-a609-d9fe8b525bc6"&gt;MEF for server side applications&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;In the current CTP bits we have not added any specific support for the server. We are planning to focus on server side support however in future releases. Mostly we see this as revolving around caching,      &lt;br /&gt;security and threading.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;2) &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/MEFramework/thread/d7f04cff-75e4-4298-a0ab-fe6ac8dfb870"&gt;MEF for Silverlight?&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Yes, MEF for Silverlight is definitely considered. As far as concrete shape, applicable scenarios and delivery vehicle and timeframe - this is still being discussed&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Також в коді можна знайти SILVERLIGHT директиви.&lt;/p&gt;  &lt;p&gt;3) &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/MEFramework/thread/cf6b7cbc-1123-4b32-9810-c235d9606b66"&gt;Comparison to the AddIn libraries?&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;These technologies can be perceived as complimentary. While both of them provide activation support, support System.AddIn-s technology focuses on versioning and isolation (multiple AppDomain support) while the focus of MEF is dependency injection through Import-Export mechanism, loose type matching and metadata around components. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;4) Що там за нутрощі?&lt;/p&gt;  &lt;p&gt;Компіляція Lambda Expressions, тобто DynamicMethod.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=7092" width="1" height="1"&gt;</content><author><name>Mike Chaliy</name><uri>http://dev.net.ua/members/Mike+Chaliy.aspx</uri></author><category term="Visual Studio" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Visual+Studio/default.aspx" /><category term="Silverlight" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Silverlight/default.aspx" /><category term="Lambda Expressions" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Lambda+Expressions/default.aspx" /><category term="Oslo" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/Oslo/default.aspx" /><category term="MEF" scheme="http://dev.net.ua/blogs/mikechaliy/archive/tags/MEF/default.aspx" /></entry></feed>