Có thể sử dụng một đại biểu ẩn danh để trả về một đối tượng không?Sử dụng một đại biểu ẩn danh để trả lại một đối tượng
Something như vậy:
object b = delegate { return a; };
Có thể sử dụng một đại biểu ẩn danh để trả về một đối tượng không?Sử dụng một đại biểu ẩn danh để trả lại một đối tượng
Something như vậy:
object b = delegate { return a; };
Có, nhưng chỉ bằng cách gọi nó:
Func<object> func = delegate { return a; };
// or Func<object> func =() => a;
object b = func();
Và tất nhiên, sau đây là đơn giản hơn rất nhiều ...
object b = a;
Trong các nhận xét, ngoại lệ của chuỗi chéo là đề cập; điều này có thể được cố định như sau:
Nếu các đại biểu là điều chúng tôi muốn chạy lại trên thread UI từ a thread BG:
object o = null;
MethodInvoker mi = delegate {
o = someControl.Value; // runs on UI
};
someControl.Invoke(mi);
// now read o
Hoặc cách khác xung quanh (để chạy các đại biểu trên BG):
object value = someControl.Value;
ThreadPool.QueueUserWorkItem(delegate {
// can talk safely to "value", but not to someControl
});
và nếu tôi đang cố gắng so sánh 'a' với một số đối tượng khác trong một phương thức trên một chuỗi khác với chuỗi trong đó' a' thuộc về? Ví dụ, 'void Test() {if (a == b) {}}' khi truy cập b từ phương thức này gây ra một ngoại lệ cross-thread. – wulfgarpro
@Wulfgar 'a' không" thuộc về "đối với một chuỗi; nó thuộc về một cá thể lớp (nếu nó là một trường), hoặc là một biến phương thức. Dù bằng cách nào, trình biên dịch sẽ "nắm bắt" biến 'a' từ phạm vi khai báo đại biểu; bằng cách tạo ra một kiểu bao bọc một trong hai thể hiện đối tượng "this" (cho một trường), hoặc "biến" chính nó; trích dẫn vì nó sau đó * trở thành * một trường. –
@Wulfgar - để có được một chủ đề chéo, bạn phải làm công việc giao diện người dùng; có, bạn có thể sửa lỗi này, nhưng "cách" phụ thuộc vào khối mã nào là mã giao diện người dùng; bạn có thể làm rõ điều đó không? –
Chỉ cần khai báo ở đâu đó các chức năng tĩnh:
public delegate object AnonymousDelegate();
public static object GetDelegateResult(AnonymousDelegate function)
{
return function.Invoke();
}
Và bất cứ nơi nào sử dụng nó như bạn muốn như thế này:
object item = GetDelegateResult(delegate { return "TEST"; });
hoặc thậm chí như thế này
object item = ((AnonymousDelegate)delegate { return "TEST"; }).Invoke();
using System;
public delegate int ReturnedDelegate(string s);
class AnonymousDelegate
{
static void Main()
{
ReturnedDelegate len = delegate(string s)
{
return s.Length;
};
Console.WriteLine(len("hello world"));
}
}
đâu 'a' đến từ đâu? Ngoài ra mã hiện tại của bạn chỉ đơn giản gán 'b' cho chính ủy nhiệm. – BoltClock
@BoltClock - cảm ơn bạn đã chỉ ra vấn đề chuyển nhượng. – wulfgarpro
xem bản cập nhật lại nỗi đau chéo luồng của bạn –