Cú pháp '=>' trong C # có nghĩa là gì?


81

Tôi chỉ xem qua cú pháp này trong một số câu hỏi trong diễn đàn này, nhưng Google và bất kỳ searchhengine nào khác có xu hướng chặn bất cứ thứ gì ngoại trừ các chữ cái và số trong tìm kiếm nên không thể tìm ra "=>".

Vì vậy, bất cứ ai có thể cho tôi biết nó là gì và nó được sử dụng như thế nào?


Câu trả lời:


84

Đó là toán tử lambda.

Từ C # 3 đến C # 5, điều này chỉ được sử dụng cho các biểu thức lambda . Về cơ bản, đây là một dạng ngắn hơn của các phương thức ẩn danh được giới thiệu trong C # 2, nhưng cũng có thể được chuyển đổi thành cây biểu thức .

Ví dụ:

Func<Person, string> nameProjection = p => p.Name;

tương đương với:

Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };

Trong cả hai trường hợp, bạn đang tạo một đại biểu với một Persontham số, trả về tên của người đó (dưới dạng một chuỗi).

Trong C # 6, cú pháp tương tự được sử dụng cho các thành viên thân biểu thức , ví dụ:

// Expression-bodied property
public int IsValid => name != null && id != -1;

// Expression-bodied method
public int GetHashCode() => id.GetHashCode();

Xem thêm:

(Và thực sự có nhiều câu hỏi tương tự - hãy thử các thẻ lambdalambda-expression .)


1
Vì câu hỏi không nói bất cứ điều gì về trường hợp chính xác được hỏi, có lẽ hãy xem xét cập nhật câu trả lời này để chứa cả cú pháp thành viên thân biểu thức mới?
Lasse V. Karlsen

1
Tuyệt vời :) Chỉ đến đây vì câu hỏi này được sử dụng làm mục tiêu cho việc đóng trùng lặp nên nghĩ rằng sẽ rất tuyệt nếu có 1 câu trả lời thay vì tiếp tục tìm kiếm một câu trả lời khác trong những trường hợp khác :)
Lasse V. Karlsen

14

Nó có nghĩa là sự tuyệt vời. Ví dụ

x => x + 1

đại diện cho một phương thức lấy x làm tham số và trả về giá trị kế thừa của nó.

button.Click += new EventHandler((sender, e) => methodInfo.Invoke(null, new object[] { sender, e }));

gán một trình xử lý sự kiện cho một nút bằng cách gọi một phương thức mà MethodInfo nắm giữ.


14

Đó là một dạng ký hiệu phương thức ngắn gọn hơn nhiều. Những điều sau gần tương đương:

// explicit method
int MyFunc(int pParam) {
   return pParam;
}

// anonymous (name-less) method
// note that the method is "wrapped" up in a hidden object (Delegate) this way
// so there is a very tiny bit of overhead compared to an explicit method
// (though it's really the assignment that causes that and would also happen
// if you assigned an explicit method to a reference)
Func<int, int> MyFunc = delegate (int pParam) { return pParam; };

// lambda expression (also anonymous)
// basically identical to anonymous method,
// except with everything inferred as much as possible, intended to be minimally verbose
Func<int, int> MyFunc = x => x;

// and => is now also used for "expression-bodied" methods
// which let you omit the return keyword and braces if you can evaluate
// to something in one line
int MyFunc(int pParam) =>
   pParam;

Hãy nghĩ về một biểu thức lambda như nói, "đã cho một cái gì đó, trả lại một cái gì đó". Trong ví dụ trên, biểu thức lambda x => xcho biết "đã cho x, trả về x", mặc dù biểu thức lambda không nhất thiết phải trả về điều gì đó, trong trường hợp đó bạn có thể đọc chúng là "đã cho x, hãy làm điều gì đó với x".

Cũng lưu ý rằng có ba thứ được gọi là "đại biểu" thoạt đầu có thể rất khó hiểu.

Một phương thức ẩn danh sử dụng delegatetừ khóa, nhưng xác định một phương thức không có tên:

Func<int, int> = delegate (int x) { return x; };

Việc gán một phương thức (ẩn danh, rõ ràng hoặc lambda) cho một tham chiếu khiến một Delegateđối tượng trình bao bọc ẩn được tạo ra, đối tượng cho phép phương thức được tham chiếu. (Về cơ bản là một loại "con trỏ chức năng được quản lý".)

Và sau đó, bạn cũng có thể khai báo chữ ký phương thức được đặt tên bằng cách sử dụng delegatetừ khóa:

public delegate int TestFunc(int x, int y);

TestFunc myFunc = delegate (int x, int y) { return x + y; };

Điều này khai báo một chữ ký được đặt tên TestFuncnhận hai ints và trả về một int, sau đó khai báo một tham chiếu ủy quyền của loại đó sau đó được gán một phương thức ẩn danh với chữ ký phù hợp.


10

đây là một ví dụ đơn giản từ msdn

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

Bất kỳ thứ gì trước dấu => là các tham số đầu vào và bất kỳ thứ gì đứng sau là biểu thức. Bạn có thể có nhiều tham số đầu vào. Lambdas chủ yếu được sử dụng với Linq.


8

Thay vì sử dụng phương pháp ẩn danh như thế này:

somevar.Find(delegate(int n)
{
   if(n < 10)
      return n;
});

bạn chỉ cần viết nó như thế này:

somevar.Find(n => n < 10);

Nó sẽ lấy kiểu dữ liệu dựa trên giá trị trả về.


3

Mã thông báo => được hỗ trợ ở hai dạng: dưới dạng toán tử lambda và là dấu phân tách tên thành viên và triển khai thành viên trong định nghĩa nội dung biểu thức.

Nhà điều hành Lambda

Trong biểu thức lambda, toán tử lambda => tách các biến đầu vào ở phía bên trái với phần thân lambda ở phía bên phải.

Ví dụ sau sử dụng tính năng LINQ với cú pháp phương thức để chứng minh việc sử dụng các biểu thức lambda:

string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
  .Where(w => w.StartsWith("a"))
  .Min(w => w.Length);
Console.WriteLine(minimalLength);   // output: 5

Định nghĩa nội dung biểu thức

Định nghĩa nội dung biểu thức có cú pháp chung sau:

member => expression;

trong đó biểu thức là một biểu thức hợp lệ. Lưu ý rằng biểu thức có thể là một biểu thức câu lệnh chỉ khi kiểu trả về của thành viên là void, hoặc nếu thành viên là một phương thức khởi tạo, một trình hoàn thiện hoặc một trình truy cập tập thuộc tính.

Ví dụ sau cho thấy một định nghĩa nội dung biểu thức cho một phương thức Person.ToString:

public override string ToString() => $"{fname} {lname}".Trim();

Đây là phiên bản viết tắt của định nghĩa phương thức sau:

public override string ToString()
{
   return $"{fname} {lname}".Trim();
}

4
Nếu bạn định sao chép và dán câu trả lời từ các trang web khác, ít nhất hãy bao gồm một liên kết đến nguồn .
Knelis

1

Về cơ bản, nó có nghĩa là "đi vào", giống như một tham số

MyObjectReference => MyObjectReference.DoSomething()

Thông thường bạn sử dụng chúng để chuyển các hàm vào các phương thức dưới dạng tham số hoặc trong các câu lệnh LINQ

MyCollection.Where(myobj => myobj.Age>10)

Ví dụ.


0

Nó là một phần của cú pháp của biểu thức lambda. Một biểu thức lambda về cơ bản là một dạng rút gọn của một đại biểu hoặc một phương thức ẩn danh. Để minh họa, giả sử rằng tôi có một mảng các chuỗi khớp với các chữ cái trong bảng chữ cái. Tôi có thể chọn ra các thành viên của mảng đó chứa các giá trị lớn hơn "E" bằng biểu thức LINQ sau:

var someLetters = alphabet.Where (l => l> "E");

Phần của biểu thức lambda ở bên trái của "=>" xác định tên biến cho thử nghiệm (được đặt cho các thành viên riêng lẻ của bảng chữ cái) và phần của biểu thức lambda ở bên phải của "=>" xác định chế biến. Trong trường hợp này, quá trình xử lý tạo ra một giá trị boolean mà logic Where sử dụng để xác định xem mỗi thành viên của bảng chữ cái có được chuyển qua mảng someLetters hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.