Mặc dù tôi sẽ tập trung vào điểm một, tôi bắt đầu bằng cách dành 2 xu cho toàn bộ vấn đề hiệu suất. Trừ khi sự khác biệt là lớn hoặc sử dụng là chuyên sâu, thường tôi không bận tâm về micro giây mà khi được thêm vào không tính đến bất kỳ sự khác biệt có thể nhìn thấy cho người dùng. Tôi nhấn mạnh rằng tôi chỉ không quan tâm khi xem xét các phương pháp không được gọi là chuyên sâu. Nơi tôi có những cân nhắc về hiệu suất đặc biệt là trên cách tôi tự thiết kế ứng dụng. Tôi quan tâm đến bộ nhớ đệm, về việc sử dụng các chủ đề, về các cách thông minh để gọi các phương thức (cho dù thực hiện một số cuộc gọi hoặc cố gắng thực hiện chỉ một cuộc gọi), cho dù kết nối với nhau hay không, v.v. không tập trung vào hiệu suất thô, nhưng về khả năng mở rộng. Tôi không quan tâm nếu nó chạy tốt hơn bởi một lát nhỏ của một nano giây cho một người dùng duy nhất, nhưng tôi quan tâm rất nhiều để có khả năng tải hệ thống với số lượng lớn người dùng đồng thời mà không nhận thấy tác động.
Có nói rằng, ở đây đi ý kiến của tôi về điểm 1. Tôi yêu phương pháp vô danh. Họ mang lại cho tôi sự linh hoạt và mã hóa sang trọng. Một tính năng tuyệt vời khác về các phương thức nặc danh là chúng cho phép tôi trực tiếp sử dụng các biến cục bộ từ phương thức container (từ góc nhìn C#, không phải từ quan điểm IL, tất nhiên). Họ phụ tùng cho tôi vô số mã. Khi nào tôi sử dụng các phương thức nặc danh? Evey lần duy nhất đoạn mã tôi cần là không cần thiết ở nơi khác. Nếu nó được sử dụng ở hai nơi khác nhau, tôi không thích sao chép-dán như là một kỹ thuật tái sử dụng, vì vậy tôi sẽ sử dụng một đại biểu ol 'đồng bằng. Vì vậy, giống như shoosh trả lời, nó không phải là tốt để có bản sao mã. Về lý thuyết không có sự khác biệt về hiệu suất như ẩn danh là thủ đoạn C#, chứ không phải thứ IL.
Hầu hết những gì tôi nghĩ về các phương thức nặc danh áp dụng cho các biểu thức lambda, vì sau này có thể được sử dụng như một cú pháp nhỏ gọn để biểu diễn các phương thức ẩn danh. Hãy giả sử phương pháp sau:
public static void DoSomethingMethod(string[] names, Func<string, bool> myExpression)
{
Console.WriteLine("Lambda used to represent an anonymous method");
foreach (var item in names)
{
if (myExpression(item))
Console.WriteLine("Found {0}", item);
}
}
Nó nhận được một chuỗi các chuỗi và cho mỗi chuỗi, nó sẽ gọi phương thức được truyền cho nó. Nếu phương thức đó trả về true, nó sẽ nói "Found ...". Bạn có thể gọi phương pháp này theo cách sau:
string[] names = {"Alice", "Bob", "Charles"};
DoSomethingMethod(names, delegate(string p) { return p == "Alice"; });
Tuy nhiên, bạn cũng có thể gọi nó theo cách sau:
DoSomethingMethod(names, p => p == "Alice");
Không có sự khác biệt trong IL giữa cả hai, được rằng một trong những cách sử dụng Biểu thức Lambda dễ đọc hơn nhiều. Một lần nữa, không có tác động hiệu suất vì đây là tất cả các thủ thuật trình biên dịch C# (không phải thủ thuật biên dịch JIT). Cũng giống như tôi không cảm thấy chúng ta đang lạm dụng các phương thức ẩn danh, tôi không cảm thấy chúng ta đang lạm dụng các biểu thức Lambda để biểu diễn các phương thức nặc danh. Tất nhiên, cùng một logic áp dụng cho mã lặp lại: Đừng làm lambdas, sử dụng các đại biểu thường xuyên. Có những hạn chế khác dẫn bạn trở lại các phương thức nặc danh hoặc các đại biểu đơn giản, chẳng hạn như tham gia ngoài hoặc đối số.
Những điều tốt đẹp khác về biểu thức Lambda là cú pháp chính xác không cần phải đại diện cho một phương thức ẩn danh. Biểu thức lambda cũng có thể biểu diễn ... bạn đoán, biểu thức. Lấy ví dụ sau:
public static void DoSomethingExpression(string[] names, System.Linq.Expressions.Expression<Func<string, bool>> myExpression)
{
Console.WriteLine("Lambda used to represent an expression");
BinaryExpression bExpr = myExpression.Body as BinaryExpression;
if (bExpr == null)
return;
Console.WriteLine("It is a binary expression");
Console.WriteLine("The node type is {0}", bExpr.NodeType.ToString());
Console.WriteLine("The left side is {0}", bExpr.Left.NodeType.ToString());
Console.WriteLine("The right side is {0}", bExpr.Right.NodeType.ToString());
if (bExpr.Right.NodeType == ExpressionType.Constant)
{
ConstantExpression right = (ConstantExpression)bExpr.Right;
Console.WriteLine("The value of the right side is {0}", right.Value.ToString());
}
}
Chú ý chữ ký hơi khác. Tham số thứ hai nhận một biểu thức chứ không phải một đại biểu. Cách gọi phương thức này sẽ là:
DoSomethingExpression(names, p => p == "Alice");
Đúng như cuộc gọi chúng tôi đã thực hiện khi tạo phương thức ẩn danh với lambda. Sự khác biệt ở đây là chúng ta không tạo ra một phương thức nặc danh, nhưng tạo ra một cây biểu thức. Đó là do những cây biểu thức mà sau đó chúng ta có thể dịch các biểu thức lambda thành SQL, đó là những gì Linq 2 SQL làm, thay vì thực thi các công cụ trong động cơ cho mỗi mệnh đề như Where, the Select, vv là cú pháp gọi là giống nhau cho dù bạn đang tạo một phương thức nặc danh hay gửi một biểu thức.
Tôi rất khuyên bạn nên truy cập www.lambdaexpression.net – Delashmate
@Delashmate miền được tiếp quản bởi kẻ gửi thư rác hiện nay – ozz