Frage

Ich arbeite an einer Erweiterung Methode, die Referenztypen nur anwendbar ist. Ich denke aber, es ist zur Zeit Boxen und Unboxing die den Wert. Wie kann ich das vermeiden?

namespace System
{
    public static class SystemExtensions
    {
        public static TResult GetOrDefaultIfNull<T, TResult>(this T obj, Func<T, TResult> getValue, TResult defaultValue)
        {
            if (obj == null)
                return defaultValue;
            return getValue(obj);
        }
    }
}

Beispiel Nutzung:

public class Foo
{
    public int Bar { get; set; }
}

In einigen Verfahren:

Foo aFooObject = new Foo { Bar = 1 };
Foo nullReference = null;

Console.WriteLine(aFooObject.GetOrDefaultIfNull((o) => o.Bar, 0));  // results: 1
Console.WriteLine(nullReference.GetOrDefaultIfNull((o) => o.Bar, 0));  // results: 0
War es hilfreich?

Lösung

Das ist nicht Boxen. Wo denken Sie es is Boxen? Wenn es daran, dass Sie bei der IL geschaut haben um „==“, lassen Sie es nicht täuschen - bekommt der JIT zu entscheiden, was hier zu tun. Es hat die Möglichkeit, verschiedenen nativen Code zu erzeugen, für jedes (T, TResult) Paar. In der Tat wird der Code für alle Referenztypen geteilt und unterscheiden sich für Werttypen. Damit Sie würden am Ende:

T = string, TResult = int (native code #1)
T = Stream, TResult = byte (native code #2)
T = string, TResult = byte (native code #2)
T = Stream, TResult = string (native code #3)

sagte, haben, wenn Sie Ihre Erweiterungsmethode Referenztypen einschränken möchten, tun Sie dies:

public static TResult GetOrDefaultIfNull<T, TResult>
    (this T obj, Func<T, TResult> getValue, TResult defaultValue)
    where T : class

Es wird noch eine Box in der IL, aber keine Sorge - keine Boxen tatsächlich auftreten. Nach allem, was könnte eingerahmt werden? Sie sind eine Referenz bereitstellt, und Verweise selbst nie sind eingerahmt -. Nur Wertart Werte sind eingerahmt

Andere Tipps

Einfach, gibt es nichts in diesem Code, die Boxen erfordern würde. Es sind Szenarien, in denen Boxen unvermeidbar ist, und es gibt auch zusätzliche OP-Codes zur Überbrückung der Lücke zwischen dem Wert / ref Typen ( constrained ) in einigen Fällen.

Aber nicht in diesem Fall; no ist erforderlich Boxen (JIT kann ein paar schachtelartige Fälle entfernen - aber nicht alle, leider)

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