Vergleichen von Strukturen für Gleichheit ohne Boxen
Ich bin auf eine Erweiterungsmethode gestoßen, die für structs @ gil(SomeStruct)
und gibt zurück, ob der Wert gleich dem @ idefault(SomeStruct)
(wenn der parameterlose Konstruktor aufgerufen wird).
public static bool IsDefault<T> (this T value)
where T : struct
{
return (!EqualityComparer<T>.Default.Equals(value, default(T)));
}
Das hat mich gefragt, ob die Struktur eingepackt wurde. Dies ist rein aus Neugier, da es je nach Kontext Vor- und Nachteile für das Boxen / Weitergeben von Werten gibt.
Annahmen
Die erste der folgenden Methoden ist ungültig, da Strukturen die Gleichheitsoperatoren nicht implizit überschreiben.==/!=
.Die zweite "erscheint", um Boxen zu vermeiden. Die dritte Methode sollte immer die Struktur boxen, da sie @ aufruobject.Equals(object o)
.Der vierte hat beide Überladungen zur Verfügung(object/T)
also ich gehe davon aus, dass es auch Boxen vermeiden wird. Die Zielstruktur müsste jedoch das @ implementiereIEquatable<T>
interface, wodurch die Hilfserweiterungsmethode nicht sehr hilfreich ist.Variationen:
public static bool IsDefault<T> (this T value)
where T : struct
{
// Illegal since there is no way to know whether T implements the ==/!= operators.
return (value == default(T));
}
public static bool IsDefault<T> (this T value)
where T : struct
{
return (!EqualityComparer<T>.Default.Equals(value, default(T)));
}
public static bool IsDefault<T> (this T value)
where T : struct
{
return (value.Equals(default(T)));
}
public static bool IsDefault<T> (this T value)
where T : struct, IEquatable<T>
{
return (value.Equals(default(T)));
}
Bei dieser Frage geht es darum, obige Annahmen zu bestätigen und ob ich etwas missverstehe und / oder auslasse.