Временами хочется, чтобы как в JAVA

8 Сен
2011

В JAVA присутствуют конструкции, которых временами не хватает в C#.
Одна из них это возможность создавать экземпляр анонимного класса на основе интерфейса напрямую в теле функции.
К примеру, следующая конструкция стандартная для JAVA и очень часто используется (вся модель событий на ней построена):
SomeClass someClass = new SomeClass();
someClass.method(new ISomeInterface()
{
@Override
public void InterfaceMethod()
{
//some code
}
});


В теле функции описывается анонимный класс, который реализует интерфейс, создается экземпляр анонимного класса и передается в тело метода. Так же, возможны всякие замыкания — использования переменных, определенных вне описания анонимного класса и т.п.
Такой возможности не хватает в C#. У расширения IEnumerable есть метод Distinct и ряд других, которым необходимо передавать в качестве параметра IEqualityComparer. Метод не принимает в себя ни каких делегатов(по причине того, что в интерфейсе IEqualityComparer присутствуют два метода).
В результате, приходится для многочисленных сущностей в проектах клепать классы, которые реализуют IEqualityComparer.
public class EntityComparer : IEqualityComparer{
public bool Equals(Entity x, Entity y)
{
//some code
}
public int GetHashCode(Entity obj)
{
//some code
}
}

И где-то в коде использовать:
var distinctEnumerable = enumerable.Distinct(new EntityComparer());

Эти классы как правило единожды используются и временами приходится реализовывать IEqualityComparer для одной и той же сущности, но с разной логикой.
А было бы просто и понятно и вся логика в одном месте:
var distinctEnumerable = enumerable.Distinct(new IEqualityComparer()
{
public bool Equals(Entity x, Entity y)
{
//some code
}
public int GetHashCode(Entity obj)
{
//some code
}
});

Жаль нету. Жду и надеюсь, что когда-нибудь появится.
По материалам Хабрахабр.



загрузка...

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

Наверх