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
столбец.
Абсолютно:
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. Это как передать чей-то адрес прямо в компанию массового маркетинга, тогда как ваш оригинальный способ больше похож на подписку на компанию массового маркетинга.
ИМО, ваш исходный код (более или менее) правильный. В частности, он позволяет указать правильный отправитель
(который должен быть экземпляром 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"
}
}