質問

ように拡張する方法のみが適用ご参考ます。と思い、そして現在、ボクシングやunboxingのの値です。したいので避ける。

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

使用例:

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

一方法:

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
役に立ちましたか?

解決

ボクシングではないです。あなたはそれ、のあるのボクシングはどこだと思いますか?あなたの周りにIL「==」を見てきましたので、それはだ場合、それはあなたをだますせてはいけない - JITは、ここでは何をすべきかを決定するために取得します。これは、各(TTResult)ペアごとに異なるネイティブコードを生成する機会を有しています。実際には、コードは、すべての参照タイプで共有され、値のタイプについて異なります。

:だから、で終わるだろう
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)
あなたが参照型へのあなたの拡張メソッドを制限したい場合は、そう、それを言ってます:

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

まだILでのボックスがあるだろう、しかし、心配しないでください - 何のボクシングは実際には発生しません。結局のところ、何が<全角> の箱詰めされるだろうか?あなたは、参照を提供している、との言及自体は箱入りされることはありません - 。型の値がボックス化されている唯一の値を

他のヒント

であるコードが必要とボクシング.あり シナリオがボクシングやむを得ないものとし、また追加opcodesの間を架橋値refの種類(constrained)もあります。

なおこの場合;no 実際の ボクシング必要(JITを除去でき数ボックスのような例がない、悲しいことに)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top