Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 30
1

Как реализуется Event с разным количеством параметров?

12.05.2014, 18:15. Просмотров 2371. Ответов 30
Метки нет (Все метки)


Возможно как то реализовать Event на который можно подписать функции с разным количеством параметров ????
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2014, 18:15
Ответы с готовыми решениями:

Процедура с разным количеством передаваемых параметров
Вот допустим "Read" можно написать с одним параметром: "Read(a)", -а можно хоть с 5:...

Конструкторы с разным количеством параметров: найти ошибку в программе
найти ошибку в программе Помогите найти ошибку в программе. Компилятор выдает ошибку Could not...

Как правильно делать документы с разным количеством одинаковых форм
Здравствуйте! Мне нужно постоянно оформлять исполнительную документацию. Все бланки стандартные,...

Форматированный вывод или как вывести коллекцию с разным количеством цифр в
выводится это : -26 -19 -19 33 22 22 1 -22 -13 10 6 30 25 -1 -18 -18 27 10 -23 -30 -24 13 -8...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
30
Эксперт .NET
14847 / 11235 / 2948
Регистрация: 17.09.2011
Сообщений: 18,817
12.05.2014, 18:18 2
Сигнатура метода-обработчика должна совпадать с сигнатурой делегата, используемого для события.
Если не совпадают, а методов много, то используйте обертку: подписывайтесь одним методом и в нем уже вызывайте нужные функции с разными параметрами.
0
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 30
12.05.2014, 18:21  [ТС] 3
Можно если не сложно простейший пример , допустим для двух функций f1(int x), f2(string s,int x);
0
Эксперт .NET
14847 / 11235 / 2948
Регистрация: 17.09.2011
Сообщений: 18,817
12.05.2014, 18:25 4
C#
1
2
3
4
5
6
7
button.Click += ButtonClicked;
 
void ButtonClicked(object sender, EventArgs e)
{
   f1(12);
   f2("Hello world!", 12);
}
0
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 30
12.05.2014, 18:31  [ТС] 5
ты меня чуть не правильно понял , это ты сразу две функции подписал , а мне их цеплять в реалтайме надо по отдельности.
0
Эксперт .NET
14847 / 11235 / 2948
Регистрация: 17.09.2011
Сообщений: 18,817
12.05.2014, 18:41 6
c0nail, я-то правильно понял.

Подумайте сами: есть событие, сигнатура обработчика которого имеет вид (object, EventArgs). Вы хотите на это событие подцепить метод с сигнатурой вида (string, int).
Вопросы: что в этот метод должен передавать объект, когда запускает событие? Почему? Как он об этом догадается?

Потому событие вам надо обрабатывать в том методе, сигнатуру которого понимает запускающий событие объект. И уже в методе динамически же решать, какой именно метод запускать и что именно в него передавать в качестве аргументов.

Ну или чтобы не растекаться мысью по древу, приведите конкретный пример с конкретными данными, где у вас возникла эта проблема.
0
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 30
12.05.2014, 18:49  [ТС] 7
Есть Event с такой сигнатурой
C#
1
2
public delegate void Action();
public event Action endPath;
Но появилась такая ситуация что мне необходимо на endPath повесить функцию GetRes(int x ){...} , вот и начал юзать форумы чтоб найти рациональное решение , а то добавлять новый евент как то не очень хочется
0
Эксперт .NET
14847 / 11235 / 2948
Регистрация: 17.09.2011
Сообщений: 18,817
12.05.2014, 18:51 8
Лучший ответ Сообщение было отмечено c0nail как решение

Решение

Цитата Сообщение от c0nail Посмотреть сообщение
появилась такая ситуация что мне необходимо на endPath повесить функцию GetRes(int x ){...}
Какое значение должно в GetRes передаваться во время срабатывания endPath? Откуда это значение берется?

Если вкратце, то используйте обертку:
C#
1
obj.endPath += () => GetRes(someValue);
Вместо someValue — то значение, которое вы хотите передать.
Однако, тут используется лямбда, потому не забывайте о захвате переменных.
1
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 30
12.05.2014, 18:57  [ТС] 9
ммм спасибо, все так как я и хотел , но что ты имел ввиду о захвате переменных?))))
0
Эксперт .NET
14847 / 11235 / 2948
Регистрация: 17.09.2011
Сообщений: 18,817
12.05.2014, 19:06 10
Цитата Сообщение от c0nail Посмотреть сообщение
но что ты имел ввиду о захвате переменных?
Ну вот пример:

C#
1
2
3
4
5
6
Action act = new Action(() => {});
 
for (int i = 0; i < 5; i++)
   act += () => Console.WriteLine(i);
 
act();
Запустите и посмотрите на вывод в консоли.
Ответом на вопрос "ЧЗХ?!" и будет захват переменных
0
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 30
12.05.2014, 19:13  [ТС] 11
бяка.... выделять память под новые переменные ((( чтото такие костыли , мне больше кажется что изначально это не правильное решение вообще )))) буду думать
0
441 / 297 / 62
Регистрация: 12.10.2009
Сообщений: 1,159
13.05.2014, 08:01 12
предлагаю такой вариант
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
 
namespace ConsoleApplication4
{
    public class EventArgsData
    {
        public EventArgsData(int test1, double test2, string test3)
        {
            Test1 = test1;
            Test2 = test2;
            Test3 = test3;
        }
 
        public int Test1 { get; set; }
        public double Test2 { get; set; }
        public string Test3 { get; set; }
    }
 
    public class EventArgs<T> : EventArgs
    {
        public EventArgs(T data) { Data = data; }
 
        public T Data { get; set; }
    }
 
    public delegate void EventHandler<T>(object sender, EventArgs<T> e); 
 
    public class Test
    {
        public void FireEvent(int test1, double test2, string test3)
        {
            var data = new EventArgsData(test1, test2, test3);
            var e = new EventArgs<EventArgsData>(data);
            TestEvent(this, e);
        }
 
        public event EventHandler<EventArgsData> TestEvent = delegate { };
    }
 
 
    class Program
    {
        static void Main(string[] args)
        {
            var test = new Test();
            test.TestEvent += (sender, e) => Console.WriteLine("Test1: {0}\r\nTest2: {1}\r\nTest3: {2}", e.Data.Test1, e.Data.Test2, e.Data.Test3);
            test.FireEvent(1, 2.0, "Hello World!!!");
            Console.ReadLine();
        }
    }
}
Добавлено через 19 минут
c0nail, при современных ценах на комплектующие, проще купить новые ядра и оперативку чем допустить что программист будет месяцами вылизывать и оптимизировать код до байта, конечно оптимизация это важно, но также нужно понимать что 1 из главнейших врагов разработки это ПРЕЖДЕВРЕМЕННАЯ оптимизация кода, современный код прежде всего должен быть ЧИТАБЕЛЕН и ПОДДЕРЖИВАЕМ, а уж если гдето и есть узкие места то об этом скажет профайлер, и программист просто должен уведомить выше стоящих об этих узких местах, пусть у них болит голова о том что код работает не идеально, и тогда ТОЛЬКО ТОГДА когда от выше стоящих специалистов придет указание о оптимизации на основании проваленных тестов, когда на это будет выделены средства и время, только тогда можно приступать к ОПТИМИЗАЦИИ потребления ресурсов, потому как иногда ВАЖНЕЕ выпустить стабильный релиз который жрет на 100 - 200 метров больше чем на 2-4 месяца зависнуть в неустойчивом состоянии рефакторинга
0
156 / 185 / 48
Регистрация: 25.11.2013
Сообщений: 978
13.05.2014, 08:34 13
Цитата Сообщение от агерон Посмотреть сообщение
public event EventHandler<EventArgsData> TestEvent = delegate { };
Делегат уже объявлен, достаточно
C#
1
public event EventHandler<EventArgsData> TestEvent;
Ну, и разумеется
C#
1
2
3
4
if (TestEvent != null)
{
TestEvent(this, e);
}
0
441 / 297 / 62
Регистрация: 12.10.2009
Сообщений: 1,159
13.05.2014, 09:03 14
DataPlanner, а если у тебя 10-20-30 событий? в каждом месте зажигания проверять их на null?? на фига мне такой геморрой + твой подход ну ни как не способствует читабельности кода т. к. if есть точка разрыва внимания, и по твоему выходит что я должен держать в голове 10-20-30 точек внимания и переключаться между ними?
0
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
13.05.2014, 09:07 15
агерон, если не проверить событие на null перед его генерацией, то забыв (случайно) подписаться на какое-то одно, получим исключение...
0
441 / 297 / 62
Регистрация: 12.10.2009
Сообщений: 1,159
13.05.2014, 09:14 16
DataPlanner, писалось это не просто так, а с личного опыта на самом деле инициализация event выглядит так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class SingletonEventHandler<T>
    {
        protected SingletonEventHandler() { }
 
        private sealed class SingletonEventHandlerCreator<T>
        {
            private static readonly EventHandler<T> instance = delegate { };
            public static EventHandler<T> Instance { get { return instance; } }
        }
 
        public static EventHandler<T> Instance
        {
            get { return SingletonEventHandlerCreator<T>.Instance; }
        }
    }
 
public event EventHandler<EventArgsData> TestEvent = SingletonEventHandler<EventArgsData>.Instance;
Добавлено через 3 минуты
insite2012, кхм... мне кажется вы не понимаете почему у меня в коде написано
C#
1
public event EventHandler<EventArgsData> TestEvent = delegate { };
Все очень просто - эта строчка и есть страховка от проверки на null, т. к. delegate{} есть пустой инициализатор события, т. е. я ВСЕГДА знаю что event != null
0
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
13.05.2014, 09:16 17
агерон, я не совсем понял... Это вместо использования встроенного делегата EventHandler<T> с проверкой на null надо так каждое событие расписывать? Это оптимизация? По моему, проще проверить, чем столько кода писать...
0
441 / 297 / 62
Регистрация: 12.10.2009
Сообщений: 1,159
13.05.2014, 09:17 18
insite2012, да это оптимизация, и это проще чем каждый раз событие проверять на NULL
0
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
13.05.2014, 09:19 19
агерон, и так для каждого события? А если их 20-30 в классе? Не сложновато-ли?
0
441 / 297 / 62
Регистрация: 12.10.2009
Сообщений: 1,159
13.05.2014, 09:21 20
т. к. проверки event'ов на NULL будут разбросаны по всему коду, а так все находиться в 1 месте

Добавлено через 1 минуту
не сложнее чем разбросать 20-30 проверок на NULL, сейчас я приведу вам пример
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2014, 09:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как отобразить двумерный массив ввиде матрицы с разным количеством строк и столбцов?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; main (){ double a; int b,c,d,e; printf (&quot;vvedite kol-vo...

Как создать метод с неизвестным количеством параметров?
Даже не знаю как объяснить... Предположим если я хочу создать метод с неизвестным количеством...

Как запрограммировать функцию со сменным количеством параметров
Кто силен в теории, ответьте, пожалуйста: Как запрограммировать функцию со сменным количеством...

Как написать лямбду с любым количеством параметров?
var x: integer; f: integer-&gt;integer := x -&gt; x &gt;= 0 ? x : -x; mult: (x,y: integer): integer...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.