2008-08-28 6 views
20

no han disparado hasta reflector para ver la diferencia, pero podría esperarse para ver exactamente el mismo código compilado al comparar Func<T, bool> vs Predicate<T>¿No es Func <T, bool> y predicar <T> lo mismo después de la compilación?

Me imagino que no hay diferencia ya que ambos toman un parámetro genérico y return bool ?

+0

@Sean - la diferencia radica en la intención de comunicación. Cuando uso un predicado, me refiero a usar el bloque de código como una 'prueba' y tomar medidas basadas en el resultado de la prueba. Cuando uso un 'Func ', solo necesito ordenar una función que toma un parámetro y devuelve un bool. – Gishu

+0

posible duplicado de [¿Por qué Func en lugar de Predicado ?] (Http://stackoverflow.com/questions/665494/why-funct-bool-instead-of-predicatet) – abatishchev

Respuesta

17

Comparten la misma firma, pero todavía son tipos diferentes.

16

Robert S. es completamente correcto; por ejemplo: -

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

Buena manera de mostrar la diferencia con el ejemplo – RichardOD

2

Cuanto más flexible Func familia sólo llegó a .NET 3.5, por lo que será funcionalmente tipos duplicados que debían incluirse antes de la necesidad.

(más el nombre Predicate comunica la intención de uso para los lectores del código fuente)

0

Incluso sin los genéricos, puede tener diferentes tipos de delegado que son idénticos en las firmas y tipos de devolución. Por ejemplo:

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); 
} 

En el ejemplo anterior, los dos tipos no genéricos tienen la misma firma y el tipo de devolución. (Y en realidad también lo mismo que Predicate<string> y Func<string, bool>). Pero como traté de indicar, el "significado" de los dos es diferente.

Esto es algo así como si hago dos clases, class Car { string Color; decimal Price; } y class Person { string FullName; decimal BodyMassIndex; }, a continuación, sólo porque ambos celebrar una string y una decimal, eso no quiere decir que sean "el mismo" tipo.

Cuestiones relacionadas