У меня есть простой вопрос о .net делегатов. Скажем, у меня есть что-то вроде этого:C# делегатов, ссылка времени разрешения
public void Invoke(Action<T> action)
{
Invoke(() => action(this.Value));
}
public void Invoke(Action action)
{
m_TaskQueue.Enqueue(action);
}
Первая функция охватывающую ссылку на this.Value
. Во время выполнения, когда вызывается первый метод с общим параметром, он будет предоставлять this.Value
как-то ко второму, но как? Это пришло мне в голову:
- Вызов по значению (структуры) - текущее значение
this.Value
получает прошло, так что еслиm_TaskQueue
выполняет его через 5 минут, то значение не будет в своем недавнем состоянии, его будет тем, что было при первом обращении. - Вызов по ссылке (ссылочный тип) - то будет ссылаться самым последнее состояние
Value
во время выполнения действия, но если я изменюthis.Value
на другую ссылку перед выполнением действия, он по-прежнему будет указывать на старые ссылки - Вызов по имени (оба) - где
this.Value
будет оцениваться при вызове действия. Я считаю, что фактическая реализация будет содержать ссылку на , а затем оценитьValue
на то, что во время фактического выполнения делегата, поскольку нет вызова по имени.
Я предполагаю, что это был бы вызов стиля имени, но не мог найти никакой документации, поэтому задаваться вопросом, является ли это четко определенным поведением. Этот класс - это что-то вроде Актера в Скале или Эрланге, поэтому мне нужно, чтобы он был потокобезопасным. Мне не нужна функция Invoke
для разыменования Value
немедленно, что будет сделано в безопасной нити для объекта this
по m_TaskQueue
.
Большое спасибо, это кристально ясно сейчас :) –