Специализни шаблонца! (udpn) wrote,
Специализни шаблонца!
udpn

Category:

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

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

Оригинал взят у __diogen__ в Товарищи попросили составить опросник для программистов на 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() { { 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.

  • Воспроизведите и объясните вывод программы.

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




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.BinarySearh(3);
     int s1 = ml.BinarySearh(4);
     ml.RemoveRange(s0, s1-s0);
   



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

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 33 comments