2008-08-28 13 views
20

Haben nicht Reflektor auf dem Unterschied sehen feuerte, aber würde man erwarten, mit dem exakt gleichen kompilierten Code, um zu sehen, wenn Func<T, bool> gegen Predicate<T>Ist nicht Func <T, bool> und Prädikat <T> das Gleiche nach der Kompilierung?

Vergleich I gibt es keinen Unterschied vorstellen würde, da beide nehmen einen generischen Parameter und zurück bool ?

+0

@Sean - der Unterschied liegt in der Kommunikation Absicht. Wenn ich ein Prädikat verwende, bezeichne ich den Codeblock als "Test" und ergreife Maßnahmen basierend auf dem Testergebnis. Wenn ich ein 'Func ' benutze, muss ich nur eine Funktion mandatieren, die einen Parameter nimmt und ein bool zurückgibt. – Gishu

+0

mögliches Duplikat von [Why Func anstelle von Prädikat ?] (Http://stackoverflow.com/questions/665494/why-funct-bool-instead-of-predicatet) – abatishchev

Antwort

17

Sie teilen die gleiche Signatur, aber sie sind immer noch verschiedene Arten.

16

Robert S. ist völlig richtig; zum Beispiel: -

class A { 
    static void Main() { 
    Func<int, bool> func = i => i > 100; 
    Predicate<int> pred = i => i > 100; 

    Test<int>(pred, 150); 
    Test<int>(func, 150); // Error 
    } 

    static void Test<T>(Predicate<T> pred, T val) { 
    Console.WriteLine(pred(val) ? "true" : "false"); 
    } 
} 
+0

Guter Weg, den Unterschied als Beispiel zu zeigen – RichardOD

2

Je flexibler Func Familie kam nur in .NET 3.5, so wird es funktionell doppelte Typen, die früher aus der Not aufgenommen werden mußten.

(plus der Name Predicate kommuniziert die beabsichtigte Verwendung für die Leser des Quellcodes)

0

Auch ohne Generika, können Sie verschiedene Delegattypen haben, die in Signaturen identisch sind und Typen zurück. Beispiel:

namespace N 
{ 
    // Represents a method that takes in a string and checks to see 
    // if this string has some predicate (i.e. meets some criteria) 
    // or not. 
    internal delegate bool StringPredicate(string stringToTest); 

    // Represents a method that takes in a string representing a 
    // yes/no or true/false value and returns the boolean value which 
    // corresponds to this string 
    internal delegate bool BooleanParser(string stringToConvert); 
} 

Im obigen Beispiel haben die beiden nicht generischen Typen dieselbe Signatur und denselben Rückgabetyp. (Und eigentlich auch das gleiche wie Predicate<string> und Func<string, bool>). Aber wie ich zu zeigen versuchte, ist die "Bedeutung" der beiden unterschiedlich.

Dies ist ein wenig wie wenn ich zwei Klassen machen, class Car { string Color; decimal Price; } und class Person { string FullName; decimal BodyMassIndex; }, dann nur, weil sie beide halten ein string und ein decimal, bedeutet das nicht, dass sie die „gleiche“ Art sind.