Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

Как сгенерировать собственное событие напрямую, безо всяких посредников

31.12.2012, 12:31. Показов 1667. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
using System;
delegate void MyEventHandler();
 
class Ping
{
    public event MyEventHandler SomeEvent;
    // Этот метод вызывается для запуска события, 
 
 
    public void OnSomeEvent()
    {
        if (SomeEvent != null)
            SomeEvent();
    }
}
 
/// <summary>
/// /////////////////////////////////////////////////////////
/// </summary>
 
class EventDemo
{
    // Обработчик события, 
    static void Handler()
    {
        Console.WriteLine("Произошло событие");
    }
    static void Main()
    {
        Ping pi = new Ping();
        pi.SomeEvent += Handler;
        pi.OnSomeEvent();
        
        //Вот так вот как написать?
        pi.SomeEvent();
    }
}
Значит, чем я недоволен: Чтобы вызвать событие нужно использовать посредника OnSomeEvent(); теперь скажите, нам мало посредников, что ещё один необходим?

Не по теме:

Тот же делегат- по сути посредник; можно было бы обойтись и без него прекрасно, вместо:

C#
1
public event MyEventHandler SomeEvent;
написать:
C#
1
public event (void* ()) SomeEvent;
и было бы круто; в С++ подобное канает, наверное
Но это я отвлёкся, всё ж таки условимся пока, что применение делегата делает код более удобочитаемым



А здесь-то что? На ровном месте добавили функцию- обёртку для генерации исключения.
Вопрос архиважный на самом деле. Дело в том, что иногда нужно напрямую генерить исключение, если функция, подобная OnSomeEvent(); просто-напросто отсутствует. Вот моя же тема: (хоть C++, но суть-то одна)
Как сгенерировать событие клика в TextBox

Там идёт речь о генерации исключения OnClick(e) на какой-то там форме, щас не вспомнить; Так вот, исключение-то есть, а функции подобной OnSomeEvent(); нет, а сгенерировать надо. Вот и приплыли.

Если я научусь генерировать исключение напрямую в собственном классе, то то же самое смогу сделать и в других. Спасибо, кто откликнется.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.12.2012, 12:31
Ответы с готовыми решениями:

Как сохранить настройки в самом exe-файле программы (безо всяких ini-файлов)?
Мда

Не устанавливается винда со флешки (черный экран безо всяких ошибок)
оригинальный msdn образ, записывал с помощью Universal-USB-Installer, причем только что было все нормально я попробовал gui-установки...

Вывод графики напрямую без посредников...
Собственно сабж... Вообще меня OpenGL всегда устраивал (имхо лучший вариант для делфи, благо врапперов много на него) и устраивает, но...

3
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.12.2012, 14:36
Читайте про паттерн Observer.
Наличие события в языке программирования - это формализация данного паттерна, согласно которой объект-издатель уведомляет объекты-подписчики об изменении своего состояния. Не другие объекты говорят ему произвести уведомление, а он уведомляет сам, когда посчитает нужным, то есть этот функционал, согласно паттерну, инкапсулирован.
Если паттерн Observer не подходит под вашу задачу - не пользуйтесь им, никто этого делать не заставляет.
Используйте обычный делегат.
1
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
31.12.2012, 14:40
C#
1
2
//Вот так вот как написать?
        pi.SomeEvent();
события на пальцах
C#
1
- встретимся у входа, как приедешь позвони, я спущусь!
вот тут человек подписался на твое событие "ОнПриехал" и вешает обработчик "спуститься"
когда приезжаешь ты вызываешь событие "приехал" (звонишь) и вызывается обработчик этого события

вот попробуй представить в этом примере что человек который тебя ждет вызовет твое событие "я приехал" - это как вообще?
сам себе позвонит от твоего имени и скажет что ты приехал самому себе?

Внешний вызов события у постороннего класса это и есть звонок самому себе
0
 Аватар для Darius
37 / 37 / 26
Регистрация: 31.05.2009
Сообщений: 103
02.01.2013, 01:43
У меня уже есть кусок проекта. Посмотрите, разберетесь.

Это сам класс
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
interface IList2
{
/// <summary>
/// Выводит весь лист на экран
/// </summary>
    void PrintAll();
}
 
public class MyList : IList, IEnumerable, ICollection
{
    private object[] _content = new object[10];
    private int _count = 0;
 
    public delegate void ShowStep(string msg);
    public event ShowStep CriticalValueObjects;
 
    public bool IsFixedSize
    {
        get
        {
            return true;
        }
    }
    public bool IsReadOnly
    {
        get
        {
            return false;
        }
    }
    public MyList()
    {
        _count = 0;
    }
    public int Add(object value)
    {
        if (_count < 10)
        {
            _content[_count] = value;
            _count++;
            if (_count > 8 && CriticalValueObjects != null)
                CriticalValueObjects(_count == 10 ? "Размер списка достиг максимального значения!" : "Размер списка приближается к максимальному!");
        }
        else 
            if (CriticalValueObjects != null)
             CriticalValueObjects("Размер списка достиг максимального значения! Добавление невозможно!");
        return 0;
    }
    public void Clear()
    {
        for (int i = 0; i <_count; i++)
            _content[i] = null;
        _count = 0;
    }
    public bool Contains(object value)
    {
        for (int i = 0; i < _count; i++)
            if (_content[i] == value)
                return true;
        return false;
    }
    public int IndexOf(object value)
    {
        for (int i = 0; i < _count; i++)
            if (_content[i] == value)
                return i;
        return -1;
    }
    public void Insert(int index, object value)
    {
        for (int i = _count; i >= index; i--)
        {
            _content[i + 1] = _content[i];
        }
        _content[index] = value;
        _count++;
    }
    public void Remove(object value)
    {
        for (int i = 0; i < _count; i++)
            if (_content[i] == value)
            {
                for (int j = i; j < _count; j++)
                    _content[j] = _content[j + 1];
                _count--;
                _content[_count] = null;
                break;
            }
    }
    public void RemoveAt(int index)
    {
        for (int i = index; i < _count; i++)
            _content[i] = _content[i+1];
        _count--;
        _content[_count] = null;
    }
    public object this[int index]
    {
        get
        {
            return _content[index];
        }
        set { }
    }
    public int Count
    {
        get
        {
            return _count;
        }
    }
    public object SyncRoot
    {
        get
        {
            return this;
        }
    }
    public IEnumerator GetEnumerator()
    {
        throw new Exception("FAIL!!");
    }
    public bool IsSynchronized
    {
        get
        {
            return false;
        }
    }
    public void CopyTo(Array array, int index)
    {
    }
 
    public void PrintAll()
    {
        for (int i = 0; i < _count; i++)
        {
            Console.Write(_content[i] + " ");
        }
        System.Console.WriteLine();
    }
}
Это способ вызова и обработчик:

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
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
/*
Реализовать набор классов, реализующих стандартные интерфейсы по работе с коллекциями из пространства имен System.Collections.
Интерфейсы:
    IEnumerable (последовательность элементов)
    ICollection (коллекция)
    IList (список)
    IDictinary (словарь)
Классы:
    List (список)
    Queue (очередь)
    Dictinary (словарь)
*/
 
 
namespace DotNETIKLab4
{
    class Program
    {
        static void Main(string[] args)
        {
//--------------------------------LIST------------------------------------//
            MyList L = new MyList();
          //L.CriticalValueObjects += ShowMsg;//Это Ваш посредник
            L.CriticalValueObjects += delegate(string message)//Это напрямую обрабтчик
            {
                System.Console.WriteLine(message);
            };
            for (var i = 1; i <= 11; i++)
            {
                L.Add(i);
                L.PrintAll();
            }
 
            MyDictionary D = new MyDictionary();
            for (int i = 0; i <= 8;i++)
                D.Add("Строка "+Convert.ToString(i+1), i+1);
            D.PrintAll();
        }
        static void ShowMsg(string message)
        {
           System.Console.WriteLine(message);
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.01.2013, 01:43
Помогаю со студенческими работами здесь

При попытке создания объекта класса bitset программа просто закрывается, безо всяких ошибок
при попытке создания объекта класса bitset программа просто закрывается, безо всяких ошибок... что это за шняга? =-O class bitset { ...

Как сгенерировать собственное исключение
using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace CLAb { ///...

Как создать собственное событие (event)
Не могу сам разобраться как создать собственное событие. Пока сделал так: создал классFriend Class Evt Public Event Hallo(ByRef...

Как создать собственное событие OnMouseEnter и OnMouseLeave для динамического компонента label[Y]?
Господа, требуется сделать событие OnMouseEnter и OnMouseLeave для создаваемых label. Есть некий компонент Memo2 в который по требованию...

Как из Form2 передать значение напрямую в событие Form1
Добрый вечер всем! Есть две формы: Form1 и Form2, как из Form2 передать значение напрямую в событие Form1 -&gt; textBox2_Click_1, чтобы...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
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. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru