Biểu thức lambda _=> expr
có nghĩa là gì?
Mục đích của _
làm đầu vào cho lambda là gì?
Thí dụ:
int count = 0;
list.ForEach(_ => count += 1);
list
là một IEnumerable<T>
, họ có thể (và nên) đã chỉ được sử dụngsum = list.Count();
Biểu thức lambda _=> expr
có nghĩa là gì?
Mục đích của _
làm đầu vào cho lambda là gì?
Thí dụ:
int count = 0;
list.ForEach(_ => count += 1);
list
là một IEnumerable<T>
, họ có thể (và nên) đã chỉ được sử dụngsum = list.Count();
Câu trả lời:
Đó là một quy ước được sử dụng khi bạn không quan tâm đến tham số.
_
là ký tự đại diện trong đối sánh mẫu. Về cơ bản nó có nghĩa là "Tôi không quan tâm, tôi luôn muốn điều này phù hợp". Sau đó, "Tôi không quan tâm" này được chuyển sang khi đặt tên cho những thứ mà bạn không quan tâm và từ đó, nó tràn sang các ngôn ngữ lập trình khác. Ví dụ, nó cũng được sử dụng trong Ruby để có nghĩa tương tự như trong ví dụ này, mặc dù _
hoàn toàn không có ý nghĩa đặc biệt trong Ruby.
Đó là một tên tham số, mặc dù không phải là một tên hữu ích, nhưng nó là tên thường được sử dụng (theo một số quy ước) khi bạn cần chỉ định rằng biểu thức có một tham số để lấy mã để biên dịch, nhưng bạn không thực sự quan tâm về nó, vì vậy bạn sẽ bỏ qua nó.
Về cơ bản, nó khai thác cú pháp cho những gì một định danh hợp pháp trong C # cấu thành và vì một định danh có thể bắt đầu bằng dấu gạch dưới và không chứa gì khác, nó chỉ là một tên tham số.
Bạn có thể dễ dàng viết:
var _ = 10;
Thread t= new Thread(()=>doSomething(x,y)); t.start();
_
là một tên biến hợp lệ. Họ chỉ đang sử dụng _
như một biến.
Tôi cũng thứ hai việc sử dụng _ => _.method()
lambdas một dòng, gọi phương thức, vì nó làm giảm trọng lượng nhận thức của hướng dẫn. Đặc biệt khi sử dụng generic, việc viết x => x.method()
chỉ thêm vào phần cân nhắc trong tích tắc "Đây là 'x' là gì? Nó có phải là một tọa độ trong không gian không?".
Hãy xem xét trường hợp sau:
Initialize<Client> ( _=>_.Init() );
Được sử dụng với lệnh gọi Generics, dấu gạch dưới trong trường hợp này hoạt động như một "biểu tượng bỏ qua". Nó tránh dư thừa, xác định rằng kiểu của đối số là hiển nhiên và có thể được suy luận khi sử dụng - giống như khi bạn sử dụng 'var' để ngăn việc lặp lại khai báo kiểu. Viết client=>client.Init()
ở đây sẽ chỉ làm cho hướng dẫn dài hơn mà không thêm bất kỳ ý nghĩa nào cho nó.
Rõ ràng, điều này không áp dụng cho các tham số được truyền cho phương thức, phương thức này nên được đặt tên mô tả. Ví dụ.:Do( id=>Log(id) );
Việc sử dụng tham số một dấu gạch dưới cho các lệnh gọi phương thức hầu như không hợp lý khi sử dụng một khối mã thay vì một lớp lót, vì mã định danh lambda bị ngắt kết nối khỏi định nghĩa chung của nó. Nói chung, khi sử dụng lại cùng một số nhận dạng, hãy đặt tên mô tả cho nó.
Điểm mấu chốt là tính chi tiết chỉ hợp lý để phân định, đặc biệt là đối với lambdas, được tạo ra để đơn giản hóa việc tạo đại biểu ẩn danh ngay từ đầu. Trong mọi trường hợp, nên sử dụng cách hiểu thông thường, cân bằng giữa tính dễ đọc và tính ngắn gọn. Nếu biểu tượng chỉ là "móc nối" với chức năng thực thì một số nhận dạng ký tự hoàn toàn ổn. Đó là trường hợp với vòng lặp For và các chữ cái "i" và "j" làm chỉ mục.
Do(id => Log(id))
tốt hơn nên viết tắt là Do(Log)
.