вторник, 12 февраля 2008 г.

"Безопасный" код.

В общем сразу после знакомства с 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# анонимные функции не могут ничего возвращать)) в общем пришлось писать функтор... Делая то-же самое на С++, я-бы мог забиндить один из параметров, здесь же так вроде-бы нельзя...

Комментариев нет: