Передача событий в C#

Trigger и Sequence можно использовать, когда вам нужен серийный номер, который каждый может легко прочитать / запомнить / понять. Но если вы не хотите таким образом управлять столбцом идентификаторов (например, emp_id), и значение этого столбца невелико, вы можете использовать SYS_GUID() при создании таблицы, чтобы получить автоматическое увеличение, как это.

CREATE TABLE <table_name> 
(emp_id RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
name VARCHAR2(30));

Теперь ваш столбец emp_id будет принимать «значение глобального уникального идентификатора». Вы можете вставить значение в таблицу, игнорируя столбец emp_id следующим образом.

INSERT INTO <table_name> (name) VALUES ('name value');

Таким образом, он вставит уникальное значение в ваш emp_id столбец.

46
задан user3891 30 June 2009 в 18:54
поделиться

2 ответа

Абсолютно:

class B
{
    private A m_a = new A();

    public event EventType EventB
    {
        add { m_a.EventA += value; }
        remove { m_a.EventA -= value; }
    }
}

Другими словами, код подписки / отмены EventB просто передает запросы на подписку / отказ от подписки в EventA.

Обратите внимание, что это не позволяет вам вызывать событие только для подписчиков, которые подписались на EventB. Это как передать чей-то адрес прямо в компанию массового маркетинга, тогда как ваш оригинальный способ больше похож на подписку на компанию массового маркетинга.

83
ответ дан 26 November 2019 в 20:22
поделиться

ИМО, ваш исходный код (более или менее) правильный. В частности, он позволяет указать правильный отправитель (который должен быть экземпляром B для людей, которые думают, что подписываются на событие на B ).

Есть некоторые уловки для уменьшения накладных расходов во время выполнения, если событие не подписано, но это добавляет больше кода:

class B {
   A m_A = new A();
   private EventType eventB;
   public event EventType EventB {
       add { // only subscribe when we have a subscriber ourselves
           bool first = eventB == null;
           eventB += value;
           if(first && eventB != null) m_A.EventA += OnEventB;
       }
       remove { // unsubscribe if we have no more subscribers
           eventB -= value;
           if(eventB == null) m_A.EventA -= OnEventB;
       }
   }

   protected void OnEventB(object sender, EventArgsType args) {
      eventB?.Invoke(this, args); // note "this", not "sender"

   }
}
11
ответ дан 26 November 2019 в 20:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: