im kinda mới với C#, vì vậy tôi đã đưa ra vấn đề này. Câu hỏi: tại sao func2 lại được gọi? ồ, và một điều nữa. nói rằng tôi thêm một chức năng cho một đại biểu. Trong hàm này tôi gọi một delegate khác, tuy nhiên tôi muốn đảm bảo rằng mọi hàm khác được thêm vào delegate đầu tiên được gọi trước khi hàm này gọi cho delegate này, có bất kỳ giải pháp sạch (không thực sự quan tâm đến getInvocationList). Xin cảm ơn các bạn, bạn là người giỏi nhất.C# đại biểu không làm việc như nó phải không?
class Program
{
delegate void voidEvent();
voidEvent test;
private void func1()
{
Console.Write("func1");
test -= func2;
}
private void func2()
{
Console.WriteLine("func2");
}
static void Main(string[] args)
{
Program p = new Program();
p.test += p.func1;
p.test += p.func2;
p.test();
}
}
+1. Vâng. Đây là lý do tại sao bạn có thể viết 'var func = p.test; if (func! = null) {func(); } 'trong kịch bản đa luồng mà không khóa bất cứ thứ gì. Bởi vì 'func' là một bản sao của' p.test' và không quan tâm đến những thay đổi được thực hiện cho 'p.test'. –
nhưng sau khi tôi gọi test- = func2 và gọi getinvocationlist tôi có thể thấy func2 không còn trong danh sách nữa. Vì vậy, bạn đang nói rằng mỗi đại biểu có hai danh sách, một trong đó hiện đang được gọi (và không thể truy cập) và một trong đó sẽ được gọi lần sau? – Yamcha
@ user1316459, nó không thực sự có hai danh sách. Nhưng khi bạn gọi một đại biểu từ một đệ, bạn có hiệu quả nói điều gì đó như: "lấy giá trị của trường * ngay bây giờ * và sau đó gọi đó". Điều đó có nghĩa là bạn đang gọi một bản sao của giá trị của 'test', không phải' test' chính nó. – svick