Головоломки на C#

Вступление

 

Казалось бы, что столько уже написано строк кода на C#, что не может быть уже ничего непредсказуемого, но язык всё равно оставляет за собой приятные неожиданности и сюрпризы, которые заставляют извилины встрепенуться и немножечко поработать в новом направлении.

В данной статье я хочу привести несколько примеров немного неожиданного поведения конструкций на C#.

Примеры

Ниже приведены 6 примеров немного нестандартных ситуаций, но довольно интересные для ознакомления:

  1. Перегрузка

    Как вы думаете что выведет данный код и почему?

    using System;
    class Base
    {
    public virtual void Foo(int x)
        {
            Console.WriteLine ("Base.Foo(int)");
        }
    }
    class Derived : Base
    {
    public override void Foo(int x)
        {
            Console.WriteLine ("Derived.Foo(int)");
        }
    public void Foo(object o)
        {
            Console.WriteLine ("Derived.Foo(object)");
        }
    }
    class Test
    {
    static void Main()
        {
            Derived d = new Derived();
    int i = 10;
            d.Foo(i);
        }
    }
  2. Порядок! Порядок!

    В каком порядке напечатаются строки на экране?

    using System;
    class Foo
    {
    static Foo()
        {
            Console.WriteLine ("Foo");
        }
    }
    class Bar
    {
    static int i = Init();
    static int Init()
        {
            Console.WriteLine("Bar");
    return 0;
        }
    }
    class Test
    {
    static void Main()
        {
            Foo f = new Foo();
            Bar b = new Bar();
        }
    }
  3. “Глупая” арифметика

    Компьютеры призваны помочь нам с арифметическими вычислениями, но почему тогда это выражение выводит false?

    double d1 = 1.000001;
    double d2 = 0.000001;
    Console.WriteLine((d1-d2)==1.0);


    А такой вариант?

    double sum = 0;
    for (int i =0;i<10 ;i++ )
    {
      sum+=0.1;
    }
    Console.WriteLine(sum==1.0);
  4. Печать, печать, печать

    Ниже приведен код, использующий анонимные методы, каков будет результат его исполнения?

    using System;
    using System.Collections.Generic;
    class Test
    {
    delegate void Printer();
    static void Main()
        {
            List<Printer> printers = new List<Printer>();
    for (int i=0; i < 10; i++)
            {
                printers.Add(delegate { Console.WriteLine(i); });
            }
    foreach (Printer printer in printers)
            {
                printer();
            }
        }
    }
  5. Ничего странного с компилятором тут не случилось

    Этот код скомпилится? Как это? Что бы это значило?

    using System;
    class Test
    {
    enum Foo { Bar, Baz };
    static void Main()
        {
            Foo f = 0.0;
            Console.WriteLine(f);
        }
    }


    А как Вам такой вариант?

    using System;
    class Test
    {
    enum Foo { Bar, Baz };
    const int One = 1;
    const int Une = 1;
    static void Main()
        {
            Foo f = One-Une;
            Console.WriteLine(f);
        }
    }
  6. Вывод типа

    Какой же вариант будет выведен на экран?

    using System;
    class Test
    {
    static void Main()
        {
            Foo("Hello");
        }
    static void Foo(object x)
        {
            Console.WriteLine("object");
        }
    static void Foo<T>(params T[] x)
        {
            Console.WriteLine("params T[]");
        }
    }

Материалы

Подготовлено по материалам http://www.yoda.arachsys.com/csharp/teasers.html

Ответы на поставленные задачи будут в следующем посте.

Advertisements


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s