Có thể khai báo hàm lambda và gọi ngay cho nó:
Func<int, int> lambda = (input) => { return 1; };
int output = lambda(0);
Tôi tự hỏi nếu nó có thể làm như vậy trong một dòng, ví dụ như một cái gì đó như
int output = (input) => { return 1; }(0);
cung cấp một lỗi biên dịch "Tên phương thức dự kiến". Đúc để Func<int, int>
không hoạt động:
int output = (Func<int, int>)((input) => { return 1; })(0);
đưa ra cùng một lỗi và vì những lý do được đề cập dưới đây, tôi muốn tránh phải chỉ định rõ ràng loại đối số đầu vào (đầu tiên int
).
Có lẽ bạn đang tự hỏi tại sao tôi muốn làm điều này, thay vì chỉ nhúng mã trực tiếp, ví dụ int output = 1;
. Lý do là như sau: Tôi đã tạo một tham chiếu cho dịch vụ web SOAP với svcutil
, vì các phần tử lồng nhau tạo ra các tên lớp cực kỳ dài, mà tôi muốn tránh phải gõ ra. Vì vậy, thay vì
var o = await client.GetOrderAsync(request);
return new Order {
OrderDate = o.OrderDate,
...
Shipments = o.Shipment_Order == null ? new Shipment[0]
o.Shipment_Order.Select(sh => new Shipment {
ShipmentID = sh.ShipmentID,
...
Address = CreateAddress(sh.ReceiverAddress_Shipment);
}).ToArray()
};
và một CreateAddress(GetOrderResultOrderShipment_OrderShipmentShipment_Address address)
phương thức riêng biệt (tên thật thậm chí còn dài hơn và tôi có quyền kiểm soát rất hạn chế về biểu mẫu), tôi muốn viết
var o = await client.GetOrderAsync(request);
return new Order {
OrderDate = o.OrderDate,
...
Shipments = o.Shipment_Order == null ? new Shipment[0]
o.Shipment_Order.Select(sh => new Shipment {
ShipmentID = sh.ShipmentID,
...
Address = sh.ReceiverAddress_Shipment == null ? null : () => {
var a = sh.ReceiverAddress_Shipment.Address;
return new Address {
Street = a.Street
...
};
}()
}).ToArray()
};
Tôi biết tôi có thể viết
Address = sh.ReceiverAddress_Shipment == null ? null : new Address {
Street = sh.ReceiverAddress_Shipment.Address.Street,
...
}
nhưng ngay cả điều đó ( sh.ReceiverAddress_Shipment.Address
phần) trở nên rất lặp đi lặp lại nếu có nhiều lĩnh vực. Tuyên bố một lambda và ngay lập tức gọi nó sẽ là ký tự ít thanh lịch hơn để viết.
public T Exec<T>(Func<T> func) => return func();
và sử dụng nó như thế này: int x = Exec(() => { return 1; });
Điều đó với tôi đọc đẹp hơn rất nhiều so với việc đúc với tất cả các parens của nó.
int output = ((Func<int>) (() => { return 1; }))();