В общем сразу после знакомства с C# у меня к нему возникло несколько притензий.
На C# можно вполне успешно писать небезопасный с точки зрения исключений код. Утечек памяти при возникновении исключений здесь конечно не будет, но все остальные прелести остаются.
Например такой код:
Какой-то класс
int foo;
int bar;
.....
public void stupid_method()
{
foo = get_foo();
bar = get_bar_by_foo(foo);// !!!
}
если значения foo и bar не могут быть любыми, скажем одно неявно зависит от другого, этот код работать правильно не будет, так как если get_bar_by_foo бросит исключение, состояние объекта останется некорректным. Самое интересное что похожий код можно встретить где угодно вплоть до учебников.
Но это и понятно, я кагбы должен чувствовать себя в безопасности программируя под дотнет)))
Еще один пример - анонимные функции. Недавно я захотел написать код, для поиска значения в списке. У контейнера List есть метод Find, который получает на вход делегат. Делегат получает по очереди все элементы списка, и в случае если один из них соответствует критерию должен вернуть true блаблабла.
код примерно такой:
List myList;
метод(myType need_to_find)
{
//myList.Find(???что сюда писать, делегат получает только один параметр типа myType???);
//казалось бы здесь можно использовать closure
Predicate<myType> pred = delegate(myType m) {
if (m == need_to_find)
return true;
return false;
};
myList.Find(pred);
}
но не тут-то было, в C# анонимные функции не могут ничего возвращать)) в общем пришлось писать функтор...
Делая то-же самое на С++, я-бы мог забиндить один из параметров, здесь же так вроде-бы нельзя...
Комментариев нет:
Отправить комментарий