<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Гайдар Магдануров : C#</title><link>http://blogs.msdn.com/gaidar/archive/tags/C_2300_/default.aspx</link><description>Tags: C#</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Ответы на задачи C# + Бонусная задача</title><link>http://blogs.msdn.com/gaidar/archive/2008/11/10/9058797.aspx</link><pubDate>Tue, 11 Nov 2008 01:18:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9058797</guid><dc:creator>gaidar</dc:creator><slash:comments>20</slash:comments><comments>http://blogs.msdn.com/gaidar/comments/9058797.aspx</comments><wfw:commentRss>http://blogs.msdn.com/gaidar/commentrss.aspx?PostID=9058797</wfw:commentRss><description>&lt;p&gt;Спасибо всем тем кто поучаствовал и &lt;a href="http://blogs.msdn.com/gaidar/archive/2008/10/26/9017096.aspx"&gt;предложил свои варианты ответов&lt;/a&gt;! Вот и я сам привожу исходный текст задачки и &lt;em&gt;ответ с кратким пояснением&lt;/em&gt;. В конце поста вас ждет еще одна маленькая, но интересная задачка.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. Каков результат компиляции и выполнения приведенного ниже кода?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;static void Main(string[] args)    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(GetSomeResult(10000));     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;static long GetSomeResult(long someValue)    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; long value1 = 10 * 1000 * 10000 * someValue;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; long value2 = 10 * 1000 * 10000 * 100000;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return value2 / value1;     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: из-за строчки long value2 = 10 * 1000 * 10000 * 100000 возникает ошибка компиляции (переполнение int), поскольку вычисления производятся в int арифметике до присвоения значения переменной value2. Чтобы ошибки не возникало, нужно использовать один из параметров типа long, для этого можно явно указать литеру L у одного из чисел&amp;#160;&amp;#160; long value2 = 10 * 1000 * 10000 * 100000&lt;strong&gt;L&lt;/strong&gt;;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. Какое значение присвоено x, если приведенный ниже код выводит False?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;float x;    &lt;br /&gt;Console.Write(x == x)&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: по спецификации это особенность NaN. Т.е. float x = float.NaN;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3. А почему следующий код выводит False?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;public static void Main()    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Test t = new Test();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(t.Equals(t));     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: этот вопрос - ловушка для людей ожидающих подвоха. Описанное поведение можно воспроизвести опледелив класс Test следующим образом: public class Test { public bool Equals(Test t) { return false; } }. Общее правило, которое подчеркивает эта задача - не стоит переопределять поведение методов с одинаковыми названиями - это обязательно запутает пользователей кода.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4. Что будет выведено на экран при выполнении приведенного ниже кода?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;static void Main(string[] args)    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; char a = 'a';     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int b = 0;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(true ? a : b);     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: 97. Типы операндов не совпадают и компилятор приводит переменные к общему совместимому типу Int32.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5. А в этом случае, что будет на экране?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;NameValueCollection col = new NameValueCollection();    &lt;br /&gt;Console.WriteLine(&amp;quot;Элемент test &amp;quot; + col[&amp;quot;test&amp;quot;] != null ? &amp;quot;Существует!&amp;quot; : &amp;quot;Не существует!&amp;quot;);&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: Существует. Сначала работает оператор +, после этого сравнивается с null строка &amp;quot;Это test&amp;quot;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;6. Что следует ожидать на экране?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Console.WriteLine(&amp;quot;A&amp;quot; + &amp;quot;B&amp;quot; + &amp;quot;C&amp;quot;);    &lt;br /&gt;Console.WriteLine('A' + 'B' + 'C');&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: ABC 198. Конкатенация для символов не определена, поэтому будут получены числовые значения, затем просуммированы.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;7. Циклическая инициализация полей? Интересненько, а в результате что будет на консоли выведено?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;public class A { public static int x = B.y + 1; }    &lt;br /&gt;public class B { public static int y = A.x + 1; }&lt;/p&gt;  &lt;p&gt;static void Main(string[] args)    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;A.x = &amp;quot; + A.x);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;B.y = &amp;quot; + B.y);     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: A.x = 2 B.y = 1. Тут все просто: вызывается конструктор A, затем конструктор B, но т.к. не определено значение A.x, то для используется 0 в конструкторе B.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;8. Инкремент, инкремент, а что же будет?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;int j = 0;&lt;/p&gt;  &lt;p&gt;for (int i = 0; i &amp;lt; 10; i++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; j = j++;&lt;/p&gt;  &lt;p&gt;Console.WriteLine(j);&lt;/p&gt;  &lt;p&gt;Ответ: 0. Подлый вопрос, поскольку тут внимание отвлекает ++. Но, на деле, оператор ++ возвращает значение переменной до инкрементации, поэтому j сохраняет исходное значение. (код, по сути, аналогичен z = j; j = j + 1; j = z ).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;9. А что будет выведено в результате такого цикла?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;int end = int.MaxValue;    &lt;br /&gt;int begin = end - 100;     &lt;br /&gt;int counter = 0;&lt;/p&gt;  &lt;p&gt;for (int i = begin; i &amp;lt;= end; i++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; counter++;&lt;/p&gt;  &lt;p&gt;Console.WriteLine(counter);&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: цикл бесконечный по определению - все значения int меньше или равны int.MaxValue.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;10. А такого?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;float begin = 1000000000;    &lt;br /&gt;int counter = 0;&lt;/p&gt;  &lt;p&gt;for (float i = begin; i &amp;lt; (begin + 10); i++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; counter++;&lt;/p&gt;  &lt;p&gt;Console.WriteLine(counter);&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: бесконечный цикл. Для таких больших значений float нет разницы между begin + 1 и begin + 10. Вообще, использовать не целые счетчики циклов - моветон и дорога в ад.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;11. Какой же метод выберет компилятор?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;class A { public void Test(int n) { Console.WriteLine(&amp;quot;A&amp;quot;); } }    &lt;br /&gt;class B : A { public void Test(double n) { Console.WriteLine(&amp;quot;B&amp;quot;); } }&lt;/p&gt;  &lt;p&gt;static void Main(string[] args)    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; B b = new B();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; b.Test(5);     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: В. Приоритет отдается методу класса, по типу ссылки, если в нем определен метод с типами аргументов позволяющих выполнить преобразование без потерь.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;12. А в этом случае?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;public class Test    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public Test(object obj) { Console.WriteLine(&amp;quot;object&amp;quot;); }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public Test(int[] obj) { Console.WriteLine(&amp;quot;int[]&amp;quot;); }     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;public static void Main() { Test t = new Test(null); }&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: Int[]. Компилятор при определении вызова не использует текущее значение, а выбирает наиболее &amp;#171;специфический&amp;#187; конструктор. Нужно явно указать указать тип, если есть желание вызвать конструктор object: new Test((object)null); &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;13. Что будут выведено на экран в результате выполнения кода приведенного ниже?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;List&amp;lt;int&amp;gt; list = new List&amp;lt;int&amp;gt;() { 1, 2, 3, 4, 5 };&lt;/p&gt;  &lt;p&gt;List&amp;lt;int&amp;gt; all = list.FindAll(    &lt;br /&gt;i =&amp;gt; { Console.Write(i); return i &amp;lt; 3; }     &lt;br /&gt;);&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: 12345. Делегат, переданный методу FindAll вызывается для каждого элемента. Вопрос на внимательность, поскольку делегат используется как фильтрующая функция, применяемая к каждому элементу.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;14. А такого кода?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;List&amp;lt;int&amp;gt; list = new List&amp;lt;int&amp;gt;() { 1, 2, 3 };    &lt;br /&gt;var x = list.GroupBy(i =&amp;gt; { Console.Write(i); return i; });     &lt;br /&gt;var y = list.ToLookup(i =&amp;gt; { Console.Write(i); return i; });&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: 123. Выполнение GroupBy отложено до обращения к результату. Вывод 123123 будет если дописать, например, строку var z = x.ToArray();&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;15. И наконец, сложный вопрос из трех частей. Что будет выведено на экран в каждом из трех случаев, приведенных ниже:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;А)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;try {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Hello &amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return;     &lt;br /&gt;}     &lt;br /&gt;finally { Console.WriteLine(&amp;quot;Goodbye &amp;quot;); }     &lt;br /&gt;Console.WriteLine(&amp;quot;world!&amp;quot;);&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: Hello Goodbye. Finally выполняется даже если выполнение прервано по return.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Б)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;try {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Hello &amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Thread.CurrentThread.Abort();     &lt;br /&gt;}     &lt;br /&gt;finally { Console.WriteLine(&amp;quot;Goodbye &amp;quot;); }     &lt;br /&gt;Console.WriteLine(&amp;quot;world!&amp;quot;); &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: Hello Goodbye. Abort выбрасывает исключение ThreadAbortException, которое обрабатывается finally, затем выполнение прерывается.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;В)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;try {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Hello &amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System.Environment.Exit(0);     &lt;br /&gt;}     &lt;br /&gt;finally { Console.WriteLine(&amp;quot;Goodbye &amp;quot;); }     &lt;br /&gt;Console.WriteLine(&amp;quot;world!&amp;quot;);&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ответ&lt;/em&gt;: Hello. Выполнение программы прерывается в точке вызова System.Environment.Exit(0) и управление передается ОС. Слишком жестко наступаем песне на горло.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;На последок, &lt;strong&gt;небольшой бонус &lt;/strong&gt;- задача, которую мне прислал &lt;a href="http://pmkinfo.tversu.ru/prof/billig.htm"&gt;Владимир Биллиг&lt;/a&gt;. Как вы думаете, что будет выведено в консоли в результате выполнения следующего кода (и почему):&lt;/p&gt;  &lt;p&gt;byte b1 = 1, b2 = 2, b3 = b1 + b2;&lt;/p&gt;  &lt;p&gt;if (b3 &amp;gt; b1)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;OK!&amp;quot;);     &lt;br /&gt;else     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;wow!&amp;quot;);&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9058797" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/gaidar/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Трюки с анонимными типами</title><link>http://blogs.msdn.com/gaidar/archive/2008/10/27/9019232.aspx</link><pubDate>Tue, 28 Oct 2008 01:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9019232</guid><dc:creator>gaidar</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/gaidar/comments/9019232.aspx</comments><wfw:commentRss>http://blogs.msdn.com/gaidar/commentrss.aspx?PostID=9019232</wfw:commentRss><description>&lt;P&gt;Пусть читатели еще немного поломают ломают голову над &lt;A href="http://blogs.msdn.com/gaidar/archive/2008/10/26/9017096.aspx" mce_href="http://blogs.msdn.com/gaidar/archive/2008/10/26/9017096.aspx"&gt;задачками из предыдущего поста&lt;/A&gt; - свои ответы я опубликую еще через неделю. Хотя, должен отметить, читатели просто молодцы и отлично справляются с решением задачек. А я тем временем опубликую оставшуюся часть материала презентации на SECR.&lt;/P&gt;
&lt;P&gt;Представим себе ситуацию, что в мы создали некоторый метод в котором хотели бы использовать список анонимных типов. Например, описываемых вот так:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;var beatleJohn = new { FirstName = "John", LastName = "Lennon" };&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;При этом мы хотим сохранить строгую типизацию списка, поэтому логичным видится использование обобщенного класса List&amp;lt;T&amp;gt;. Однако, возникает вопрос, как нам чисто синтаксически создать обобщенный список не зная имени типа - фактически для нас анонимные типы, как и следует из названия, являются безымянными. Тут нужно вспомнить о технике создания обобщенной коллекции по экземпляру типа элемента коллекции.&lt;/P&gt;
&lt;P&gt;Использование этого метода может выглядеть так:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;var beatles = (new[] { beatleJohn }).ToList();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;В результате мы получаем строго типизированный список, тип которого легко узнать воспользовавшись Console.WriteLine(beatles.GetType()): выводит симпатичное имячко System.Collections.Generic.List`1[&amp;lt;&amp;gt;f__AnonymousType0`2[System.String,System.String]], однако это знание нам просто для интереса и на практике никак не пригодится.&lt;/P&gt;
&lt;P&gt;С полученным списком мы можем работать следующим образом:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;beatles.Add(new { FirstName = "Paul", LastName = "McCartney" }); &lt;BR&gt;beatles.Add(new { FirstName = "George", LastName = "Harrison" }); &lt;BR&gt;beatles.Add(new { FirstName = "Ringo", LastName = "Starr" }); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;foreach (var beatle in beatles) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(beatle.FirstName + " " + beatle.LastName); &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Хорошо, так мы можем создавать обобщенные коллекции анонимных типов, но что мешает воспользоваться этой техникой для...&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Перед тем как читать дальше, я прошу слабонервных и легко восприимчивых к грязным трюкам закрыть глаза.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;... для того, чтобы возвращать анонимные типы из методов.&lt;/P&gt;
&lt;P&gt;Предположим, что у нас есть следующий метод:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;static object GetBeatleName() { return new { First = "John", Last = "Lennon" }; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Метод возвращает некий объект, что замечательно, однако чтобы этим объектом можно было удобно пользоваться, прибегнем к описанному выше методу и определим вспомогательный обобщенный метод для приведения типов:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;static T CastType&amp;lt;T&amp;gt;(object obj, T type) { return (T)obj; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;которым воспользуемся так:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;var beatle = CastType(obj, new {First = "", Last = ""});&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Как и в предыдущем примере мы используем технику типизации экземпляром объекта. В результате можем дальше отлично работать с полученным объектом:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;Console.WriteLine("First = {0}, Last = {1}", beatle.First, beatle.Last);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Сама по себе техника очень интересна и может быть полезна, однако, перед тем как бросаться использовать эту технику для возвращения анонимных типов, подумайте - если у вас есть тип, который стоит повторно использовать в других методах, то почему бы не описать его как подобает и не использовать лишнего шаманства, имеющего тенденцию к снижению читаемости кода.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Листинг примера 1&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;using System; &lt;BR&gt;using System.Linq; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;namespace ConsoleApplication1 &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var beatlesMember = new { FirstName = "John", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LastName = "Lennon" }; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var beatlesList =&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (new[] { beatlesMember }).ToList(); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beatles.Add(new { FirstName = "Paul", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LastName = "McCartney" }); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beatles.Add(new { FirstName = "George", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LastName = "Harrison" }); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beatles.Add(new { FirstName = "Ringo",&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LastName = "Starr" }); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var beatle in beatles) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(beatle.FirstName + &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " " + beatle.LastName); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/FONT&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Листинг примера 2&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;using System; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;namespace ConsoleApplication1 &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static object GetBeatleName() { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new { First = "John", Last = "Lennon" }; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static T CastType&amp;lt;T&amp;gt;(object obj, T type) {&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (T)obj; } &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object obj = GetBeatleName(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var beatle = CastType(obj, new { First = "", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Last = "" }); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("First={0}, Last={1}", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; beatle.First, beatle.Last); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;} &lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9019232" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/gaidar/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Задачки на C#</title><link>http://blogs.msdn.com/gaidar/archive/2008/10/26/9017096.aspx</link><pubDate>Mon, 27 Oct 2008 01:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9017096</guid><dc:creator>gaidar</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/gaidar/comments/9017096.aspx</comments><wfw:commentRss>http://blogs.msdn.com/gaidar/commentrss.aspx?PostID=9017096</wfw:commentRss><description>&lt;P&gt;В прошлый четверг &lt;A href="http://secr.ru/?pageid=4548&amp;amp;submissionid=5482" mce_href="http://secr.ru/?pageid=4548&amp;amp;submissionid=5482"&gt;на конференции SECR&lt;/A&gt; я сделал небольшой доклад по некоторым не совсем очевидным моментам в C#, которые могут поставить в тупик программиста. В этом сообщении я публикую список задач, о котором рассказал на конференции. &lt;/P&gt;
&lt;P&gt;Я предлагаю сыграть в следующую игру - посмотрите на задачи, запишите решения пришедшие вам в голову (условие: не запускать и не компилировать программы!), а потом напишите в комментариях к сообщению количество правильных ответов (можно проверить запустив компилятор, а можно дождаться публикации решений - я сделаю это через несколько дней). Если не стесняетесь, то сразу напишите ваши предположения и объяснения по полученному результату.&lt;/P&gt;
&lt;P&gt;Задачи я собирал давно, ниже приведены лишь самые простые, которые очень удобно показывать на слайдах презентации. Саму презентацию меня сподвигла сделать книга &lt;A href="http://www.amazon.com/Java-TM-Puzzlers-Pitfalls-Corner/dp/032133678X/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1225058903&amp;amp;sr=8-1" mce_href="http://www.amazon.com/Java-TM-Puzzlers-Pitfalls-Corner/dp/032133678X/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1225058903&amp;amp;sr=8-1"&gt;Java Puzzlers: Traps, Pitfalls, and Corner Cases&lt;/A&gt;, поскольку часть задачек оказалась похожими как две капли воды. Кстати, не может не радовать, что многие проблемные моменты Java, на которых строятся задачи из книги, в C# просто отсутствуют :)&lt;/P&gt;
&lt;P&gt;Если у вас есть интересные задачи на C# - присылайте, я с радостью добавлю их в коллекцию!&lt;/P&gt;
&lt;H1&gt;Задачи&lt;/H1&gt;
&lt;P&gt;&lt;STRONG&gt;1. Каков результат компиляции и выполнения приведенного ниже кода?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;static void Main(string[] args) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(GetSomeResult(10000)); &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;static long GetSomeResult(long someValue) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; long value1 = 10 * 1000 * 10000 * someValue; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; long value2 = 10 * 1000 * 10000 * 100000; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return value2 / value1; &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2. Какое значение присвоено x, если приведенный ниже код выводит False?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;float x; &lt;BR&gt;Console.Write(x == x)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. А почему следующий код выводит False?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;public static void Main() &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Test t = new Test(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(t.Equals(t)); &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;4. Что будет выведено на экран при выполнении приведенного ниже кода?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;static void Main(string[] args) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char a = 'a'; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int b = 0; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(true ? a : b); &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;5. А в этом случае, что будет на экране?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;NameValueCollection col = new NameValueCollection(); &lt;BR&gt;Console.WriteLine("Элемент test " + col["test"] != null ? "Существует!" : "Не существует!");&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;6. Что следует ожидать на экране?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Console.WriteLine("A" + "B" + "C"); &lt;BR&gt;Console.WriteLine('A' + 'B' + 'C');&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;7. Циклическая инициализация полей? Интересненько, а в результате что будет на консоли выведено?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;public class A { public static int x = B.y + 1; } &lt;BR&gt;public class B { public static int y = A.x + 1; }&lt;/P&gt;
&lt;P&gt;static void Main(string[] args) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("A.x = " + A.x); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("B.y = " + B.y); &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;8. Инкремент, инкремент, а что же будет?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;int j = 0;&lt;/P&gt;
&lt;P&gt;for (int i = 0; i &amp;lt; 10; i++) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; j = j++;&lt;/P&gt;
&lt;P&gt;Console.WriteLine(j);&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;9. А что будет выведено в результате такого цикла?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;int end = int.MaxValue; &lt;BR&gt;int begin = end - 100; &lt;BR&gt;int counter = 0;&lt;/P&gt;
&lt;P&gt;for (int i = begin; i &amp;lt;= end; i++) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter++;&lt;/P&gt;
&lt;P&gt;Console.WriteLine(counter);&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;10. А такого?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;float begin = 1000000000; &lt;BR&gt;int counter = 0;&lt;/P&gt;
&lt;P&gt;for (float i = begin; i &amp;lt; (begin + 10); i++) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter++;&lt;/P&gt;
&lt;P&gt;Console.WriteLine(counter);&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;11. Какой же метод выберет компилятор?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;class A { public void Test(int n) { Console.WriteLine("A"); } } &lt;BR&gt;class B : A { public void Test(double n) { Console.WriteLine("B"); } }&lt;/P&gt;
&lt;P&gt;static void Main(string[] args) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; B b = new B(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b.Test(5); &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;12. А в этом случае?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;public class Test &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Test(object obj) { Console.WriteLine("object"); } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Test(int[] obj) { Console.WriteLine("int[]"); } &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;public static void Main() { Test t = new Test(null); }&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;13. Что будут выведено на экран в результате выполнения кода приведенного ниже?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;List&amp;lt;int&amp;gt; list = new List&amp;lt;int&amp;gt;() { 1, 2, 3, 4, 5 };&lt;/P&gt;
&lt;P&gt;List&amp;lt;int&amp;gt; all = list.FindAll( &lt;BR&gt;i =&amp;gt; { Console.Write(i); return i &amp;lt; 3; } &lt;BR&gt;);&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;14. А такого кода?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;List&amp;lt;int&amp;gt; list = new List&amp;lt;int&amp;gt;() { 1, 2, 3 }; &lt;BR&gt;var x = list.GroupBy(i =&amp;gt; { Console.Write(i); return i; }); &lt;BR&gt;var y = list.ToLookup(i =&amp;gt; { Console.Write(i); return i; });&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;15. И наконец, сложный вопрос из трех частей. Что будет выведено на экран в каждом из трех случаев, приведенных ниже:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;А)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;try { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Hello "); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return; &lt;BR&gt;} &lt;BR&gt;finally { Console.WriteLine("Goodbye "); } &lt;BR&gt;Console.WriteLine("world!");&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Б)&lt;/STRONG&gt;&lt;/P&gt;try { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Hello "); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.CurrentThread.Abort(); &lt;BR&gt;} &lt;BR&gt;finally { Console.WriteLine("Goodbye "); } &lt;BR&gt;Console.WriteLine("world!"); 
&lt;P&gt;&lt;STRONG&gt;В)&lt;/STRONG&gt;&lt;/P&gt;try { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Hello "); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Environment.Exit(0); &lt;BR&gt;} &lt;BR&gt;finally { Console.WriteLine("Goodbye "); } &lt;BR&gt;Console.WriteLine("world!");&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9017096" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/gaidar/archive/tags/Other/default.aspx">Other</category><category domain="http://blogs.msdn.com/gaidar/archive/tags/C_2300_/default.aspx">C#</category></item></channel></rss>