что вы используете в C#-е, если требуются анонимные классы?
Что такое не статические и что такое анонимные классы?
ср. вопрос сипласпласника джависту: что вы используете вместо указателей? или там вместо деструкторов?
Видимо, используются неанонимные классы. Так ли уже важна анонимность?
Чем блистать своими выдающимися способностями к стёбу, лучше бы хоть ссылки привёл (раз уж лень так объяснять).
Прочёл. А зачем нужны не статические и анонимные классы?
Используй C# 3.5!
3.5 - это номер бета версии .NET'а
Используй C# 3.5!что там можно использовать взамен анонимных классов?
P.S. надеюсь, что ты понимаешь, что анонимные классы в C# 3.0 (.NET 3.5) и анонимные классы в Java это совсем разные вещи, просто названия совпали.
Так ли уже важна анонимность?да, код становится громоздким, и как следствие, плохо читаемым
А зачем нужны не статические и анонимные классы?часто встречающийся случай: некоторый алгоритм потребляет некоторый интерфейс IA (в качестве аргумента метода или свойства). Тебе нужно выполнить этот алгоритм находясь внутри какого-нибудь класса (или даже метода для анонимных классов для этого делается нестатический приватный класс A, в котором можно обращаться напрямую к нестатическим членам внешнего класса (в том числе и приватным). В C# для этого требуется передавать в конструктор внутреннего класса ссылку на экземпляр внешнего класса.
А зачем нужны не статические и анонимные классы?кстати, ответный вопрос, ты анонимные методы в C# 2.0 используешь?
Приведи лучше пример кода.
если приводить кусок реального кода, то придется много объяснять что там и за чем. Учебный пример можно найти в каком-нибудь учебник по Java. Преобразовывать реальный пример так, чтобы было кратко, это надо напрягаться
А от описания класса внутри метода он становится более читабельным?
Не вижу большого выигрыша анонимных классов перед inner.
Не нашел java эквивалента List.Find (Predicate<T> match) там в таких случаях тоже анонимные классы используются?
в примере надо только показать только ту идею, которую ты хочешь донести, пример необязательно должен успешно компилироваться: какие-то куски можно опускать, какие-то куски можно даже на псевдокод заменять
Не нашел java эквивалента List.Find (Predicate<T> match) там в таких случаях тоже анонимные классы используются?гы
придумал извращенский способ
List<Rate> rates = new ArrayList<Rate>
rates.indexOf(new Object {
public boolean equals(Object obj) {
return super.equals(obj);
}
});
а вообще этот метод статический в классе Collections
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c);
при вызове компаратор можно указать анонимным
upd:
чето глюканул
это ж бинарисерч, на неотсортированных списках не будет работать
значит первый способ вовсе не извращенский
и вообще, что find возвращает? может все маченные элементы а не только первый попавшийся? тогда я такого универсального метода в джаве не припомню...
>припомню...
Это первый, а есть еще FindAll
List<Rate> rates = new ArrayList<Rate>Особой читабельности в этом не заметно.
rates.indexOf(new Object {
public boolean equals(Object obj) {
return super.equals(obj);
}
});
Особой читабельности в этом не заметно.странный ты
свой код для начала приведи
List<Rate> rates = new List<Rate>
var rate = names.Find(obj => super.Equals(obj;
var rate = names.Find(obj => super.Equals(obj;, похоже джависты слили
Так вот, если твой алгоритм параметризуется каким-то методом, тебе вовсе не нужно оборачивать этот метод в интерфейс. Передавай так. Понадобится передать два метода — передашь два метода. Понадобится передать четыре — сделаешь интерфейс и нормальный класс, потому что анонимный класс с четыремя методами — это перебор как-то уже немножко.
Анонимные делегаты совершенно замечательно реализуют замыкание как по всем переменным того метода, в котором они объявлены, так и по полям объекта. Опять же: если тебе вдруг нужно что-нибудь сложное и много, лучше всё-таки вынести это что-нибудь в отдельный класс и передавать туда даже не this, а то, что нужно в явном виде, во избежание недоразумений.
если ты не можешь объяснить своими словами, не можешь привести свой пример, значит ты не понимаешь то, что делаешь.Чё за тупые наезды? Ты хотя бы внимательно прочитай весь тред, и не делай ложных намеков:
ты не можешь объяснить своими словами
Почему не привел пример, я на писал. Я ж тут не на экзамене. Вообще, я думал непринужденно пообщаться с действующими программистами. А тут сразу на личности перешли. Нечего сказать по теме, лучше не пиши.
Между прочим, мы сейчас можем наблюдать известный психологический феномен: человек, вынужденный в течение длительного времени производить некое действие или действия неэффективным, неправильным образом, выстраивает массив рационализаций и объяснений, призванных скомпенсировать возникающую фрустрацию, так что даже когда необходимость делать то, что он делал, так, как он это делал (через жопу) исчезает, пациент продолжает повторять бессмысленные действия и чувствует беспокойство при попытке от них отказаться.если ты обо мне, то ты не прав, с Java я познакомился как раз после C#, и считаю его "вторым" языком для себя. Т.е. к анонимным классам я не успел привыкнуть, просто увидел что такое есть.
Так вот, если твой алгоритм параметризуется каким-то методом, тебе вовсе не нужно оборачивать этот метод в интерфейс. Передавай так.
так это, извините, как? Если речь о C# 2.0, то ты все равно определяешь делегат, а это элемент типа класс/интерфейс.
Понадобится передать два метода — передашь два метода.
Если так рассуждать, то классы можно разбить на отдельные методы, и мы получим процедурный язык , и никакой тебе инкапсуляции.
Понадобится передать четыре — сделаешь интерфейс и нормальный класс, потому что анонимный класс с четыремя методами — это перебор как-то уже немножко.
анонимный класс с тремя свойствами и одним методом я вполне себе могу представить. Рассуждение как-то странно выглядит, типа 2-3 метода еще нормально, а 4 уже много, откуда такие числа? из личного опыта? так не надо его так сильно обобщать.
Анонимные делегаты совершенно замечательно реализуют замыкание как по всем переменным того метода, в котором они объявлены, так и по полям объекта.
да, полное замыкание анонимных делегатов это несомненный плюс.
Опять же: если тебе вдруг нужно что-нибудь сложное и много, лучше всё-таки вынести это что-нибудь в отдельный класс и передавать туда даже не this, а то, что нужно в явном виде, во избежание недоразумений
в явном это в каком? в виде параметров, копируя переменные? а если методы внешнего класса нужны (даже приватные)? прикручивать еще один интерфейс? и сопровождать его? Стоит ли игра свеч?
Опять же: если тебе вдруг нужно что-нибудь сложное и многов реальности оно бывает так, что сейчас его мало и оно простое, а потом мало помалу, раз, а уже и не такое простое. Получается, что надо отлавливать момент, когда требуется рефакторинг, и переводить анонимные делегаты на классы. А тут как обычно сроки поджимают, да и писал это кто-то другой, а тебе дали только добавить небольшую фичу.
В ответ на:да, простой академический пример это не показатель. Да и не противопоставляют я анонимные делегаты анонимным классам, я хочу иметь и те и другие.
var rate = names.Find(obj => super.Equals(obj;
, похоже джависты слили
Почему не привел пример, я на писал. Я ж тут не на экзамене. Вообще, я думал непринужденно пообщаться с действующими программистами.фактически ты этим говоришь: "мое время ценнее, чем время всех остальных форумчан вместе взятых, поэтому пусть эти форумчане тратять свое некому не нужное время на то, чтобы разобраться, что вообще я имел ввиду, когда жаловался, что мне не хватает анонимных классов"
Чо? При объявлении метода вместо джава стайл
public interface IComparer
{
int compare(object a, object b);
}
public void sort(object[] array, IComparer comparer) {..}
пишешь
public delegate int Comparer(object a, object b);
public void Sort(object[] array, Comparer comparer) {..}
А вызов практически одинаковый и там, и там, в одном случае — анонимный класс, в другом — анонимный же делегат. Второе быстрее, надёжней, практичней. Заморачиваться прямо сейчас о том, что где-то когда-то непонятно каким образом у компарера появятся дополнительные методы по-моему не стоит. Ну или приведи беспокоящий тебя пример, я представить что-то не могу никак!
>> в явном это в каком? в виде параметров, копируя переменные? а если методы внешнего класса нужны (даже приватные)? прикручивать еще один интерфейс? и сопровождать его? Стоит ли игра свеч?
http://en.wikipedia.org/wiki/Law_of_Demeter
http://en.wikipedia.org/wiki/Law_of_DemeterКстати, не имеет никакого отношения к данной проблеме.
Inner class - часть внутренней логики основного класса, довольно нерационально выносить его наружу.
Второе быстрее,уже второй раз слышу подобное заблуждение
Interface calls are faster than delegate calls.
http://www.devsource.ziffdavis.com/article2/0,1759,1617062,00.asp
но сейчас речь не о производительности
Interface calls are faster than delegate calls.не написано на какой версии .net-а проводилось иследование
Article : Delegates vs. Interfaces
From : epardue
Date : 9/24/2006 1:49:14 PM
Subject : Delegates are faster in VS2005 (FX 2.0)
Message 1 of 1
Previous Message Next Message
It should be made clear that the article's findings apply to Visual Studio 2003 (FX 1.1). I ran the sample code in both environments and found that the tables have turned and that delegates are now faster. I would love to read an article that explains how the CLR team managed to achieve this, considering that this article's author's premise is that delegates are more complex and do more work, fundamentally, when they are called.
I am surprised that an update to this article has not been published since VS2005 was released. This article is highly indexed through Google, other search engines, and most importantly, here, where articles written about functionality in FX 2.0 are linking to this article as if it is a current FX 2.0 article. Performance-oriented articles should not be arbitrarily cited or linked to simply because the topic appears to be relevant if the context of the article is a different generation of the product. This spreads misinformation and wastes developers' time.
Оставить комментарий
6yrop
вот очередной раз вспоминаю добрым словом разработчиков C#, почему они не взяли из Java нестатические и анонимные классы.Нестатические классы еще более менее сносно эмулируется, а вот с анонимными получается совсем некрасиво.
В большинстве случаев анонимные классы имеют один метод, и вместо них можно использовать анонимные методы, но остается неприятный осадок из-за того, что в будущем количество методов может увеличиться