2009-08-01 24 views
9

Ich habe für Moq durch den Quellcode zu lesen und ich kam in der folgenden Unit-Test:Was bedeutet() => in C#?

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

Und für das Leben von mir, ich kann mich nicht erinnern, was() => tatsächlich der Fall ist. Ich denke, es hat etwas mit anonymen Methoden oder Lambda zu tun. Und ich bin sicher, dass ich weiß, was es tut, ich kann einfach nicht im Moment erinnern ....

Und noch schlimmer zu machen .... google isn't being much help und neither is stackoverflow

Kann mir jemand eine schnelle geben Antwort auf eine hübsche noobish Frage?

+0

mich erinnert, wenn ich Informationen über „* =“ in SQL ... nicht die meisten Such eng anschaute inine friendly operator ... –

+0

Wenn ich das richtig verstehe, bedeutet das, dass, wenn Times.AtLeast (0) falsch ist, eine Ausnahme ausgelöst wird. Hab ich recht? Funktioniert das nur im Debug-Modus? –

Antwort

11

() => ist ein Null-Lambda-Ausdruck. Es stellt eine anonyme Funktion dar, die an assert.Throws übergeben wird und irgendwo innerhalb dieser Funktion aufgerufen wird.

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

// prints "Hello Hello " 
+1

Also, im Wesentlichen erstellt der Einheitentestcode eine anonyme Methode, die eine Methode aufruft, die dann von der Throws-Methode ausgeführt wird, die die ausgelöste Ausnahme behandelt und behauptet, dass die richtige Ausnahme ausgelöst wurde? – mezoid

+0

ja. .................... – Jimmy

12

Suche StackOverflow für "Lambda".

Im Einzelnen: „ein Verfahren, das keine Argumente und gibt void zurück nimmt, und wenn Sie es nennen, schreibt er die Nachricht an die Konsole“

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

Das bedeutet,

Sie können es speichern in einem Aktionsvariable:

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

Und dann kann man es nennen:

a(); 
+0

Irgendein Grund für den Downvote oder das Entfernen der Stimme? –

+0

Es war nicht ich, aber wahrscheinlich, weil "Search Stack Overflow für Lambda" nicht sehr hilfreich ist, wenn man bedenkt, dass das OP eingeräumt hat, dass er weiß, dass es etwas mit Lambdas zu tun hat. +1 von mir, obwohl. –

+0

Wahrscheinlich hat jemand es abgelehnt, bevor Sie Ihre erste Antwort erweitert haben. Betrachtet man jetzt deine Antwort, ist das definitiv sehr hilfreich. – mezoid

0

ich nicht Programm in C#, aber "C# Lambda" versehen this link googeln das beantwortet deine Frage !!!

2

Das ist die Definition einer Lambda (anonyme) Funktion. Im Wesentlichen ist es eine Möglichkeit, eine Funktion inline zu definieren, da Assert.Throws eine Funktion als Argument akzeptiert und versucht, sie auszuführen (und dann zu überprüfen, ob eine bestimmte Ausnahme ausgelöst wird).

Im Wesentlichen ist das Snippet, das Sie dort haben, ein Komponententest, der sicherstellt, dass Times.AtLeast (0) eine ArgumentOutOfRangeException auslöst. Die Lambda-Funktion ist notwendig (anstatt nur versuchen, die Times.AtLeast-Funktion direkt von Assert.Throws aufzurufen), um das richtige Argument für den Test zu übergeben - in diesem Fall 0.

MSDN KB Artikel zum Thema hier : http://msdn.microsoft.com/en-us/library/bb882516.aspx

4
() => Times.AtLeast(0) 

() anzeigt, dass die Lambda-Funktion keine Parameter oder Rückgabewert hat.

=> zeigt an, dass ein Codeblock folgen soll.

Times.AtLeast (0) ruft die statische Methode ATLEAST Time Klasse mit einem Parameter von 0.

9

Es ist ein Lambda-Ausdruck.Die häufigste Syntax wird mit einem Parameter, so gibt es keine Klammern um es benötigt:

n => Times.AtLeast(n) 

Wenn die Anzahl der Parameter ist etwas anderes als ein, Klammern benötigt werden:

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

Wenn es Null-Parameter, erhalten Sie das etwas umständlich Syntax mit den Klammern um die leeren Parameterliste:

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

ahhh .... das macht sehr viel Sinn! Vielen Dank! – mezoid