いを避けるボクシング/unboxingきます。オブジェクト?
-
25-09-2019 - |
質問
ように拡張する方法のみが適用ご参考ます。と思い、そして現在、ボクシングや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は、ここでは何をすべきかを決定するために取得します。これは、各(T
、TResult
)ペアごとに異なるネイティブコードを生成する機会を有しています。実際には、コードは、すべての参照タイプで共有され、値のタイプについて異なります。
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を除去でき数ボックスのような例がない、悲しいことに)
所属していません StackOverflow