__diogen__ (__diogen__) wrote,
__diogen__
__diogen__

Category:

Товарищи попросили составить опросник для программистов на C#

Я, естественно, не стал отказывать хорошим людям.

1. Создатели MS C# ввели в стандартную библиотеку контейнер SortedDictionary, представляющий бинарное дерево. Данный контейнер реализует функции интерфейса IDictionary, который, в свою очередь, наследует интерфейсу IEnumerable. Набор функций, поддерживаемых этими интерфейсами, согласуется с возможностями класса Dictionary, представляющего хэш-таблицу.

  • Указать, какой функции (или какого набора функций) не хватает этим интерфейсам для адекватной поддержки возможностей, предоставляемых бинарными деревьями.
  • Указать, к каким неудобствам приводит имеющийся в C# крен в сторону хэш-таблиц при использовании типов, определенных пользователем, в качестве ключей ассоциативных массивов.

  • 2. Создатели MS С# взяли на себя заботы об управлении памятью, которые так тяготили программистов на C++. В итоге в самый неожиданный момент память может закончиться. Укажите, каков правильный способ вызова потенциально опасного в этом смысле кода. Оцените удобства и преимущества предложенного вами метода в сравнении со старообразным ручным управлением памяти.

    3. Создатели MS С# взяли на себя заботы об управлении памятью, которые так тяготили программистов на C++. Укажите, о каких видах требующих освобождения ресурсов забыли создатели C#. Расскажите о практикующихся в С# методах работы с такими ресурсами.

    4. Прикиньте, сколько интерфейсов для предикатов сравнения определено в языке C#. Оцените количество избыточных и дублирующихся интерфейсов. Почему предлагаемый С# шаблон для предиката сравнения является избыточным? Имеет ли преимущества такое избыточное определение, и если да, то для чего.

    5. Создатели MS C# ввели в язык форматный вывод (Console.Write), но забыли о существовании форматного ввода. Как эмулировать форматный ввод в случае, если необходимо считать с консоли таблицу данных с известным количеством столбцов, типами переменных по столбцам и разделителями? Приведите пример.

    6. Бьерн Страуструп как-то сказал: «типичная программа на C++ состоит из 80% кода и 20% данных; типичная программа на C# состоит из 80% данных и 20% кода». Посчитайте, как соотносятся объемы памяти, занимаемой функционально-эквивалентными программами на C++ и C#.

    7. Имеется код на C#:

    class Abcd
    {
        public int _x;
        public Abcd(int x);
    }

    void f()
    {
        var xxx = new Dictionary<int, Abcd>() { { 1, new Abcd(1) }, { 2, new Abcd(2) } };
        g(xxx[1]);
        foreach(var zzz in xxx) Console.Write(“{0}”, zzz.Value._x);
    }
    void g(Abcd v ){v._x = 2;}

  • Объясните, почему инициализация, аналогичная инициализации переменной xxx, не работает в случае List<T>.
  • Воспроизведите и объясните вывод программы.
  • Сообщите, что вы думаете о безопасности языков, все объекты в которых представлены указателями и передаются только по ссылке, а константные параметры функций отсутствуют.

  • 8. Создатели MS С#, озабоченные падением эффективности языка, все массивы в котором являются массивами полиморфных объектов, ввели в C# структуры, передающиеся по значению, и придумали боксинг. Объяснить, какие особенности определения структур C# приводят к их вымыванию из итогового кода и делают боксинг бесполезным.

    9. Создатели MS C#, в похвальном желании сделать свой язык безопасней, пополнили синтаксис, связанный с шаблонами, конструкцией where. Объяснить ее назначение. Привести примеры ситуаций, в которых существующая в С# семантика шаблонов приводит к необходимости использовать технику copy-paste.

    10. По той же причине создатели MS C# запретили голые ссылки на функции-члены класса, введя вместо них т.н. делегаты, представляющие собой комбинацию из ссылки на функцию-член класса и указателя на конкретный объект (также делегаты могут быть ссылками на статические функции, но в данном случае это неважно). Предложить, каким образом в описанной ситуации надлежит реализовывать известный прием, когда базовый класс владеет таблицей, заполняемой ссылками на функции-члены дочерних классов (вызываемые от имени базового класса).

    11. Имеется код на C#:

         var ml=new List(new int[]{1,2,3,3,3,3,3,3,4,4,4,4,5,6,7,8});
         int s0 = ml.BinarySearch(3);
         int s1 = ml.BinarySearch(4);
         ml.RemoveRange(s0, s1-s0);
        

    Каково будет состояние массива ml после его выполнения?
    Subscribe
    • Post a new comment

      Error

      default userpic

      Your IP address will be recorded 

      When you submit the form an invisible reCAPTCHA check will be performed.
      You must follow the Privacy Policy and Google Terms of use.
    • 11 comments