Копирующие делегаты

PDO является стандартом, это - то, что большинство разработчиков будет ожидать использовать. mysqli был по существу сделанным на заказ решением конкретной проблемы, но он имеет все проблемы других определенных для DBMS библиотек. PDO - то, куда вся тяжелая работа и умные взгляды пойдут.

11
задан David 22 October 2009 в 19:28
поделиться

5 ответов

Делегаты неизменяемы, поэтому ссылка, полученная в этом коде, гарантированно не изменится. Если пользователь подписывается или отказывается от подписки после нулевой проверки, будет создан новый делегат, настроенный на событие. Однако, поскольку у вас есть ссылка на совершенно другой объект и вы вызываете его, вам не нужно беспокоиться о его нулевом значении.

18
ответ дан 3 December 2019 в 03:35
поделиться

Вы правы; он копирует ссылку.

Однако делегаты неизменяемы; когда вы добавляете обработчик к событию, создается новый делегат, объединяющий текущий обработчик (ы) с новым, а затем назначается полю.

Экземпляр делегата, на который ссылается поле, не может быть изменен, поэтому он действительно избегает состояния гонки.

5
ответ дан 3 December 2019 в 03:35
поделиться

Это тоже из MSDN ..

«Список вызовов делегата - это упорядоченный набор делегатов, в котором каждый элемент списка вызывает ровно один из методы, представленные делегатом. Список вызовов может содержать повторяющиеся методы. Во время вызова методы вызываются в том порядке, в котором они появляются в списке вызовов. Делегат пытается вызвать каждый метод в своем списке вызовов; дубликаты вызываются один раз каждый раз, когда они появляются в списке вызовов. Делегаты неизменны; после создания список вызовов делегата не изменяется. "

1
ответ дан 3 December 2019 в 03:35
поделиться

if (something! = Null) something (); выглядит так, как будто он гарантирует, что something никогда не будет нулевым, когда something () равно вызывается, но на самом деле это не гарантирует этого в многопоточном сценарии. Другой поток может установить any = null между проверкой и вызовом.

Foo temp = whatever;
if (temp != null) temp();

Этот код исключает возможность разыменования null, поскольку temp является локальным и поэтому никогда не будет изменен другой веткой. Таким образом, это предотвращает состояние гонки. Однако это не предотвращает всех соответствующих условий гонки. Эрик Липперт провел более подробное обсуждение некоторых других проблем с кодом.

0
ответ дан 3 December 2019 в 03:35
поделиться

Эрик Липперт уже рассказывал об этом в очень подробном сообщении .

3
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

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