Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2

Передача параметра в событие

15.09.2020, 22:36. Показов 3768. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стоит вопрос о передаче параметров посредством ивента. То есть чтобы подписчик мог спокойно оперировать информацией.
В моем случае, это ObservableCollection<string> и сообщение, в виде строки. По аналогии, можно вынести несколько свойств, как это сделано в SampleEventArgs. И тут я увидел, что есть некий делегат Action который можно использовать вместо SampleEventArgs. Или это не есть хуже читаемо? Т.е.
C#
1
public event Action<ObservableCollection<string>, string> SampleEvent;
Из документации MS:
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
namespace EventsDemo
{
    class Program
    {
        // Declare the delegate (if using non-generic pattern).
        public delegate void SampleEventHandler(object sender, SampleEventArgs e);
 
        // Declare the event.
        public event SampleEventHandler SampleEvent;
 
        // Wrap the event in a protected virtual method
        // to enable derived classes to raise the event.
        protected virtual void RaiseSampleEvent()
        {
            // Raise the event in a thread-safe manner using the ?. operator.
            SampleEvent?.Invoke(this, new SampleEventArgs("Hello"));
        }
    }
 
    public class SampleEventArgs
    {
        public SampleEventArgs(string text) { Text = text; }
        public string Text { get; } // readonly
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.09.2020, 22:36
Ответы с готовыми решениями:

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

Передача параметра в поток
Добрый вечер. Никак не получается передать SerialPort в поток. static void Main(string args) { SerialPort...

Передача метода в качестве параметра
//Есть делегат вида: delegate int Calculation(int x, int y); //И методы, наподобие int task1 (int x, int y); int task2 (int x, int...

12
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
15.09.2020, 22:44
Цитата Сообщение от Luca Brasi Посмотреть сообщение
В моем случае, это ObservableCollection<string> и сообщение, в виде строки. По аналогии, можно вынести несколько свойств, как это сделано в SampleEventArgs.
чет мне не кажется что передавать ссылку на мутабельную коллекцию подписчику разумная идея))
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
15.09.2020, 22:53  [ТС]
FateOri, вроде ж как string'и иммутабл)
https://docs.microsoft.com/en-... ence-types
Цитата Сообщение от FateOri Посмотреть сообщение
чет мне не кажется что передавать ссылку на мутабельную коллекцию подписчику разумная идея))
а как лучше?
0
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
15.09.2020, 23:32
Цитата Сообщение от Luca Brasi Посмотреть сообщение
FateOri, вроде ж как string'и иммутабл)
не string а ObservableCollection<string>

Цитата Сообщение от Luca Brasi Посмотреть сообщение
а как лучше?
ну вы мне контекст дайте)
а то не понятно какую проблему решаете
0
172 / 91 / 36
Регистрация: 22.05.2020
Сообщений: 308
16.09.2020, 00:05
Luca Brasi, если вы беспокоитесь о читаемости, что предполагает передачу исходного кода кому-то кроме его автора, рекомендую использовать делегат EventHandler<T> где T - ваш класс аргументов события - наследник EventArgs.
C#
1
2
3
4
5
class MyEventArgs : EventArgs {}
 
class Program {
  public event EventHandler<MyEventArgs> MyEvent;
}
Во-первых, это общепринятый подход к использованию событий и читатель вашего кода поймёт его легче.
Во-вторых, подход с выделенным классом аргументов события позволяет легко добавлять новые свойства без необходимости правки всех методов-подписчиков.
В-третьих, EventHandler<T> даёт возможность передавать object sender, что в свою очередь даёт возможность одной функции-подписчику подписываться на события от разных объектов но и различать их при необходимости.
и т.д.
1
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
16.09.2020, 08:38  [ТС]
valker, да уже адаптировал в подобном виде. Еще такой банальный вопрос, можно ли хранить несколько классов в одном файле? И когда этого делать не стоит.
0
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
16.09.2020, 09:01
Luca Brasi, можно делать всё что угодно. Но хранить классы в одном файле не стоит никогда.
1
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
16.09.2020, 10:11  [ТС]
TrickyBestia, в Java 7 (не знаю как сейчас) это в принципе запрещено на уровне компиляции. А тут почему-то можно.
0
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
16.09.2020, 10:23
Luca Brasi, а зачем это запрещать?
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
16.09.2020, 10:43  [ТС]
ну если этого не стоит делать никогда, то зачем запрещать?)
0
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
16.09.2020, 11:29
Luca Brasi, нужно чтобы был выбор. А то как же говнокод писать?
0
172 / 91 / 36
Регистрация: 22.05.2020
Сообщений: 308
16.09.2020, 19:20
Цитата Сообщение от Luca Brasi Посмотреть сообщение
можно ли хранить несколько классов в одном файле? И когда этого делать не стоит.
Это вопрос соглашения о стиле кодирования. В большинстве распространённых соглашений рекомендуют придерживаться структуры один класс - один файл. Тем не менее, если необходимость разместить несколько классов в одном файле чем-то обусловлена, не вижу причин чтобы не сделать исключение из правила в таком случае.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
17.09.2020, 01:03
Цитата Сообщение от Luca Brasi Посмотреть сообщение
Цитата Сообщение от FateOri Посмотреть сообщение
чет мне не кажется что передавать ссылку на мутабельную коллекцию подписчику разумная идея))
а как лучше?
А для чего вам вообще передавать ObservableCollection...?
Событие передаёт изменение, в данном случае список изменённых строк.
А ObservableCollection, по самому её смыслу, это постоянная коллекция у которой меняется только её состав.
И её передача куда-либо, ломает сам смысл её использования.

Самое логичное предавать сделать массив или список и методом AsReadOnly() получить его неизменяемую оболчку.
Её и передавать.

Добавлено через 55 секунд
Цитата Сообщение от valker Посмотреть сообщение
рекомендую использовать делегат EventHandler<T>
Одобрямс!

Добавлено через 7 минут
Цитата Сообщение от valker Посмотреть сообщение
Тем не менее, если необходимость разместить несколько классов в одном файле чем-то обусловлена, не вижу причин чтобы не сделать исключение из правила в таком случае.
Так и есть.

Очень часто бывает необходимость создавать очень простые классы, порой настолько, что у них и тела нет.
Допустим, что-то подобно (частый приём в WPF)
C#
1
2
3
public class StringObservableCollection : ObservableCollection<string> {}
public class IntegerObservableCollection : ObservableCollection<int> {}
public class PointObservableCollection : ObservableCollection<Point> {}
Для классов же имеющих тело больше 10-15 строк, конечно, вряд ли стоит их делать в одном файле.

Для больших классов даже лучше разбивать реализацию на несколько файлов.
Допустим, файлы: с конструкторами, со статическими членами, со свойствами, с методами и т.д.

Добавлено через 2 минуты
Цитата Сообщение от Luca Brasi Посмотреть сообщение
Из документации MS:
Кстати неудачный пример.
Не закрытые делегаты (так же как и классы) лучше объявлять на уровне пространства имён, а не вложенными в другие типы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2020, 01:03
Помогаю со студенческими работами здесь

Передача параметра в разные методы
Допустим есть некий параметр x. И так получилось что параметр x,встречается во всех методах. А именно -Сначала я с помощью параметра...

Передача класса в качестве параметра
Возможно ли передать класс в качестве параметра определённой функции что бы она на базе этого класса создавала объекты???

Передача одноразового параметра в переменную
Доброго времени суток, заметил многие люди пишут код, где присваивают что-то в переменную (локальную) и после используют её только один...

Передача параметра string в функцию
Приветствую. List&lt;string&gt; get_match_code(string code) { string _temp1 = code, _temp2 = &quot;0&quot;; ...

Передача параметра в абстрактном классе
В задании нужно написать абстрактный класс n-мерный вектор. Суть в том, что я не знаю, как указать этот параметр в классе. Сначала сделал...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru