Frage

Ich habe den Reflektor noch nicht gestartet, um mir den Unterschied anzusehen, aber würde man erwarten, beim Vergleich genau den gleichen kompilierten Code zu sehen? Func<T, bool> vs. Predicate<T>

Ich könnte mir vorstellen, dass es keinen Unterschied gibt, da beide einen generischen Parameter annehmen und bool zurückgeben?

War es hilfreich?

Lösung

Sie haben die gleiche Signatur, sind aber dennoch unterschiedlicher Art.

Andere Tipps

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

Je flexibler Func Die Familie ist erst in .NET 3.5 angekommen und dupliziert daher funktionell Typen, die früher aus Notwendigkeit eingebunden werden mussten.

(Plus der Name Predicate teilt den Lesern des Quellcodes die beabsichtigte Verwendung mit)

Auch ohne Generika können Sie verschiedene Delegattypen haben, die in ihren Signaturen und Rückgabetypen identisch sind.Zum 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 anzudeuten versucht habe, ist die „Bedeutung“ der beiden unterschiedlich.

Das ist ungefähr so, als würde ich zwei Klassen erstellen, class Car { string Color; decimal Price; } Und class Person { string FullName; decimal BodyMassIndex; }, dann nur, weil beide einen halten string und ein decimal, das bedeutet nicht, dass sie vom „gleichen“ Typ sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top