2009-08-01 89 views
9

Tôi đã đọc qua các mã nguồn cho Moq và tôi đi qua các bài kiểm tra đơn vị sau đây:() => có nghĩa là gì trong C#?

Assert.Throws<ArgumentOutOfRangeException>(() => Times.AtLeast(0)); 

Và đối với cuộc sống của tôi, tôi không thể nhớ những gì() => thực hiện. Tôi nghĩ rằng nó có một cái gì đó để làm với các phương pháp vô danh hoặc lambdas. Và tôi chắc chắn rằng tôi biết những gì nó làm, tôi chỉ không thể nhớ tại thời điểm này ....

Và để làm cho vấn đề tồi tệ hơn .... google isn't being much helpneither is stackoverflow

Ai đó có thể cho tôi một cách nhanh chóng trả lời cho một câu hỏi khá ngớ ngẩn?

+0

Remembers tôi khi tôi đang tìm kiếm thông tin về "* =" trong SQL ... không phải là eng tìm kiếm nhiều nhất ine thân thiện với nhà điều hành ... –

+0

nếu tôi hiểu điều này một cách chính xác, nó có nghĩa là nếu Times.AtLeast (0) là sai thì một số ngoại lệ được ném. Tôi có đúng không? Điều này sẽ chỉ hoạt động trên chế độ "gỡ lỗi"? –

Trả lời

11

() => là biểu thức lambda rỗng. nó đại diện cho một hàm ẩn danh được truyền cho khẳng định. Các hàm này và được gọi ở đâu đó bên trong hàm đó.

void DoThisTwice(Action a) { 
    a(); 
    a(); 
} 
Action printHello =() => Console.Write("Hello "); 
DoThisTwice(printHello); 

// prints "Hello Hello " 
+1

Vì vậy, về cơ bản, mã kiểm thử đơn vị đang tạo ra một phương thức ẩn danh gọi một phương thức mà sau đó được thực hiện bởi phương thức Throws xử lý ngoại lệ được ném và khẳng định rằng ngoại lệ đúng được ném ra? – mezoid

+0

có. .................... – Jimmy

12

Tìm kiếm StackOverflow cho "lambda".

Cụ thể là: "một phương pháp mà không có đối số và trả về void, và khi bạn gọi nó, nó viết tin nhắn để giao diện điều khiển"

() => Console.WriteLine("Hi!"); 

Điều đó có nghĩa

Bạn có thể lưu nó trong một biến Action:

Action a =() => Console.WriteLine("Hi!"); 

Và sau đó bạn có thể gọi nó là:

a(); 
+0

Bất kỳ lý do nào cho phiếu giảm giá hoặc xóa bỏ phiếu bầu? –

+0

Đó không phải là tôi, nhưng có lẽ vì "Tìm kiếm tràn ngăn xếp cho lambda" không phải là rất hữu ích xem xét các OP thừa nhận rằng ông biết nó có cái gì để làm với lambdas. 1 từ tôi, mặc dù. –

+0

Ai đó có thể đã bỏ phiếu trước khi bạn mở rộng câu trả lời ban đầu của bạn. Nhìn vào câu trả lời của bạn bây giờ, mặc dù, nó chắc chắn là rất hữu ích. – mezoid

0

tôi không có chương trình trong C#, nhưng Googling "C# Lambda" cung cấp this link trả lời câu hỏi của bạn !!!

2

Đó là định nghĩa của hàm lambda (ẩn danh). Về cơ bản, đó là một cách để định nghĩa một hàm inline, vì Assert.Throws lấy một hàm làm đối số và cố gắng chạy nó (và sau đó xác minh rằng nó ném một ngoại lệ nhất định).

Về cơ bản, đoạn mã bạn có ở đó là kiểm thử đơn vị đảm bảo rằng Times.AtLeast (0) ném ra một ArgumentOutOfRangeException. Hàm lambda là cần thiết (thay vì chỉ cố gắng gọi hàm Times.AtLeast trực tiếp từ Assert.Throws) để chuyển đối số thích hợp cho thử nghiệm - trong trường hợp này 0.

Bài viết MSDN KB về chủ đề tại đây : http://msdn.microsoft.com/en-us/library/bb882516.aspx

4
() => Times.AtLeast(0) 

() cho biết hàm lambda không có tham số hoặc giá trị trả lại.

=> chỉ ra rằng một khối mã cần làm theo.

Times.AtLeast (0) gọi phương pháp ít nhất tĩnh lớp của Times với một tham số của 0.

9

Đó là một biểu thức lambda.Cú pháp phổ biến nhất là sử dụng một tham số, vì vậy không có dấu ngoặc đơn cần thiết xung quanh nó:

n => Times.AtLeast(n) 

Nếu số lượng các tham số là một cái gì đó khác hơn một, dấu ngoặc đơn là cần thiết:

(n, m) => Times.AtLeast(n + m) 

Khi có zero thông số, bạn sẽ có được cú pháp hơi vụng về với ngoặc xung quanh danh sách tham số rỗng:

() => Times.AtLeast(0) 
+0

ahhh .... điều đó có ý nghĩa rất nhiều! cảm ơn! – mezoid