То, что вы делаете, хорошо, но я бы предпочел соглашение об отмене подписки на старые обработчики событий перед подпиской на новые, просто чтобы избежать любого потенциального "перекрытия", когда оба объекта могут попытаться обработать то же событие, если оно сработало из другого потока между вызовами.
Для незначительного улучшения вы можете обойтись без лишних скобок, чтобы сделать код более компактным и «аккуратным» (где «аккуратнее» в глазах смотрящего).
set
{
if (value != foo)
{
if (foo != null)
foo.SomeEvent -= foo_SomeEvent;
if (value != null)
value.SomeEvent += foo_SomeEvent;
foo = value;
}
}
Если вы запрещаете использовать нулевые ссылки (например, используя ссылку на «нулевой объект Foo» вместо нулевого), тогда вы можете полностью отказаться от ifs:
set
{
if (value != foo)
{
foo.SomeEvent -= foo_SomeEvent;
value.SomeEvent += foo_SomeEvent;
foo = value;
}
}
В некоторых случаях, когда у вас много свойств, работающих с похожими объектами / событиями, вы также можете реализовать код подкачки в (универсальном) вспомогательном методе, чтобы у вас была реализация в одном месте, а все ваши свойства просто вызывали общего помощника. метод. Это было бы полезно, если бы вы могли совместно использовать одну реализацию для многих свойств:
set
{
Helpers.SetValueAndResubscribeFooSomeEvent(ref foo, value);
}