2009-08-01 13 views
9

Czytałem poprzez kod źródłowy dla Moq i natknąłem się na następujący test jednostki:Co oznacza() => w C#?

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

I dla życia mnie, nie mogę sobie przypomnieć, co() => faktycznie robi. Myślę, że ma to coś wspólnego z anonimowymi metodami lub lambdami. I jestem pewien, że wie, co robi, ja po prostu nie pamiętam w tej chwili ....

i co gorsza .... google isn't being much help i neither is stackoverflow

Czy ktoś może mi dać szybkie odpowiedzieć na całkiem nieobliczalne pytanie?

+0

mnie pamięta kiedy szukałem informacji na temat „* =” w SQL ... nie najbardziej wyszukiwania inż ine friendly operator ... –

+0

jeśli rozumiem to poprawnie, oznacza to, że jeśli Times.AtLeast (0) jest fałszywe, to zostanie zgłoszony wyjątek. Mam rację? Czy to działa tylko w trybie "debugowania"? –

Odpowiedz

11

() => jest nullarnym wyrażeniem lambda. reprezentuje anonimową funkcję, która jest przekazywana do assert.Throws i jest wywoływana gdzieś wewnątrz tej funkcji.

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

// prints "Hello Hello " 
+1

A zatem, kod testu jednostkowego tworzy anonimową metodę, która wywołuje metodę, która jest następnie wykonywana przez metodę Throws, która obsługuje zgłoszony wyjątek i zapewnia zgłoszenie prawidłowego wyjątku? – mezoid

+0

tak. .................... – Jimmy

12

Wyszukaj StackOverflow dla "lambda".

szczególności: „metodę, która pobiera żadnych argumentów i zwraca void, a gdy go nie nazywać, to pisze wiadomość do konsoli”

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

Oznacza to, że

Można przechowywać ją w zmiennej działania:

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

a następnie można nazwać:

a(); 
+0

Jaki jest powód do zabierania głosu lub odebrania głosu? –

+0

To nie byłem ja, ale prawdopodobnie dlatego, że "Przeszukiwanie stosu przepełnienia dla lambda" nie jest zbyt pomocne, biorąc pod uwagę, że PO potwierdził, że wiedział, że ma to coś wspólnego z lambdami. +1 ode mnie. –

+0

Ktoś prawdopodobnie wycofał go, zanim rozszerzyłeś swoją początkową odpowiedź. Patrząc teraz na twoją odpowiedź, jest to z pewnością bardzo pomocne. – mezoid

0

nie mam program w C#, ale googlowania "C# Lambda" pod warunkiem this link to odpowiada na twoje pytanie !!!

2

To jest definicja funkcji lambda (anonimowej). Zasadniczo jest to sposób na zdefiniowanie funkcji inline, ponieważ Assert.Throws przyjmuje funkcję jako argument i próbuje ją uruchomić (a następnie sprawdzić, czy zgłasza pewien wyjątek).

Zasadniczo, fragment, który tam masz, jest testem jednostkowym, który sprawia, że ​​Times.AtLeast (0) zgłasza wyjątek ArgumentOutOfRangeException. Funkcja lambda jest konieczna (zamiast po prostu próbować wywołać funkcję Times.AtLeast bezpośrednio z Assert.Throws) w celu przekazania poprawnego argumentu dla testu - w tym przypadku 0.

MSDN KB artykuł na ten temat tutaj : http://msdn.microsoft.com/en-us/library/bb882516.aspx

4
() => Times.AtLeast(0) 

() wskazuje, że funkcja ma parametrów lambda lub wartość.

=> oznacza, że ​​należy wykonać blok kodu.

Times.AtLeast (0) nazywa klasa Times jest metoda statyczna conajmniej z parametrem 0.

9

Jest to wyrażenie lambda.Najczęstszym składnia jest za pomocą parametru, więc nie ma nawiasów potrzebne wokół niego:

n => Times.AtLeast(n) 

Jeżeli liczba parametrów jest czymś innym niż jeden, potrzebne są nawiasy:

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

Gdy istnieją zerowe parametry, masz nieco niewygodne składni z nawiasami wokół pustej listy parametrów:

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

ahhh .... to ma wiele sensu! dzięki! – mezoid