Tôi có một câu hỏi đơn giản về đại biểu .net. Giả sử tôi có một cái gì đó như thế này:C# đại biểu, thời gian giải quyết tham chiếu
public void Invoke(Action<T> action)
{
Invoke(() => action(this.Value));
}
public void Invoke(Action action)
{
m_TaskQueue.Enqueue(action);
}
Hàm đầu tiên bao gồm tham chiếu đến this.Value
. Trong suốt thời gian chạy, khi phương thức đầu tiên, với tham số chung được gọi, nó sẽ cung cấp this.Value
bằng cách nào đó với phương thức thứ hai, nhưng làm thế nào? Những bước vào tâm trí tôi:
- Gọi theo giá trị (struct) - giá trị hiện tại của
this.Value
được thông qua, vì vậy nếum_TaskQueue
thực hiện nó 5 phút sau, giá trị sẽ không được ở trạng thái gần đây của nó, nó sẽ là bất cứ điều gì khi tham khảo lần đầu. - Gọi bằng cách tham khảo (loại tài liệu tham khảo) - sau đó trạng thái gần đây nhất của
Value
sẽ được tham chiếu trong khi thực hiện hành động nhưng nếu tôi thay đổithis.Value
để tham khảo khác trước khi thực hiện các hành động, nó vẫn sẽ được trỏ đến các tài liệu tham khảo cũ - Gọi theo tên (cả hai) - trong đó
this.Value
sẽ được đánh giá khi hành động được gọi. Tôi tin rằng việc thực hiện thực tế sẽ giữ một tham chiếu đếnthis
sau đó đánh giáValue
về điều đó trong quá trình thực thi thực tế của đại biểu vì không có cuộc gọi theo tên.
Tôi cho rằng đó sẽ là Gọi kiểu tên nhưng không thể tìm thấy bất kỳ tài liệu nào để tự hỏi liệu đó có phải là hành vi được xác định rõ hay không. Lớp học này là một cái gì đó giống như một diễn viên trong Scala hoặc Erlang vì vậy tôi cần nó được thread an toàn. Tôi không muốn chức năng Invoke
để dereference Value
ngay lập tức, sẽ được thực hiện trong một chủ đề an toàn cho this
đối tượng theo m_TaskQueue
.
Cảm ơn rất nhiều, đó là tinh thể rõ ràng ngay bây giờ :) –