Từ "đại biểu" bị lạm dụng một chút. Nó dễ dàng hơn với các lớp và các đối tượng. Một "lớp" giống như một kế hoạch chi tiết cho một đối tượng. Một "đối tượng" là một thực thể trong bộ nhớ, theo sau bản thiết kế của lớp.
Đối với đại biểu chúng tôi sử dụng cùng một từ, do đó tôi nghi ngờ sự nhầm lẫn của bạn. Hãy xem xét mã sau:
class Main
{
public delegate int DelegateType(string x);
public int SomeFunction(string y) { return int.Parse(y)*2; }
public void Main()
{
DelegateType delegateInstance = null;
delegateInstance = SomeFunction;
int z = delegateInstance("21");
Console.WriteLine(z);
}
}
Mã này xuất ra "42".
DelegateType
là loại đại biểu. Giống như một lớp học là một kế hoạch chi tiết cho một đối tượng, đại biểu là một kế hoạch chi tiết cho một hàm .
Vì vậy, sau này chúng tôi tạo biến có tên delegateInstance
thuộc loại DelegateType
. Với biến đó, chúng ta có thể gán hàm ANY lấy một tham số chuỗi đơn và trả về một số nguyên. Lưu ý rằng chúng tôi đã gán chức năng chính nó, không phải là kết quả của hàm đó. Nó giống như biến số delegateInstance
bây giờ là một từ đồng nghĩa của hàm đó. Thật vậy, như đã trình bày một dòng sau, chúng ta có thể sử dụng delegateInstance
để gọi funcion đó! Cũng giống như nếu delegateInstance
là một chức năng. Nhưng, vì nó biến đổi, chúng ta cũng có thể làm tất cả những thứ tương tự mà chúng ta thường làm với các biến - như chuyển chúng thành các tham số cho các hàm khác, hoặc thậm chí trả về từ các hàm khác (Hàm trả về một hàm! !)
OK, chúng ta hãy xem mã đã khiến bạn bối rối.
public static void Save()
{
ThreadStart threadStart = delegate
{
SaveToDatabase();
};
new Thread(threadStart).Start();
}
private static void SaveToDatabase() { }
Điều đầu tiên cần lưu ý là bạn đã sử dụng anonymous delegate
. Một sự lạm dụng thuật ngữ khác. Khi biên soạn, nó kết quả trong một cái gì đó như thế này:
public static void Save()
{
ThreadStart threadStart;
threadStart = __ASDASDASD6546549871;
var tmp = new Thread(threadStart);
tmp.Start();
}
private static void SaveToDatabase() { }
private void __ASDASDASD6546549871()
{
SaveToDatabase();
}
Lưu ý rằng chức năng ẩn danh của bạn đã thực sự chuyển thành một chức năng hoàn toàn bình thường với một tên ngẫu nhiên, và sau đó chức năng được gán cho biến threadStart
.
Vì vậy, bây giờ điều này giống như ví dụ trên.Chỉ cần thay thế DelegateType
bằng ThreadStart
, delegateInstance
với threadStart
và SomeFunction
với __ASDASDASD6546549871
.
Bây giờ có ý nghĩa không?
tại sao không 'ThreadStart threadStart = new ThreadStart (SaveToDatabase);' – Anirudha
Tôi không nghĩ rằng bất cứ điều gì đang được trả lại vì không có từ khóa 'return'. Tôi nghĩ rằng một 'thread' mới đang được tạo ra sẽ thực thi phương thức được chỉ định bởi delegate. –
@ Some1.Kill.The.DJ - nó sẽ thực sự, dài hạn, có một vài tham số. – Dave