は、私は以下のコードについていくつか質問している:構造体の場合は、いつ使用するステートメントボックスにその引数がありますか?
using System;
namespace ConsoleApplication2
{
public struct Disposable : IDisposable
{
public void Dispose() { }
}
class Program
{
static void Main(string[] args)
{
using (Test()) { }
}
static Disposable Test()
{
return new Disposable();
}
}
}
私の質問は以下のとおりです。
- が
Disposable
構造体上で動作し、ステートメントを使用しますが、Test()
ボックスから構造体を返され、そうでありませんか? - 私は自分自身で答えを見つけることができますか?自分自身を見つけるためにしようとする
は、私は上記のコードによって産生されたILを検査し、ここでILはMain(...)
方法のためです。私は、そこに仮想メソッドの呼び出しを疑う
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] valuetype ConsoleApplication2.Disposable CS$3$0000)
L_0000: call valuetype ConsoleApplication2.Disposable ConsoleApplication2.Program::Test()
L_0005: stloc.0
L_0006: leave.s L_0016
L_0008: ldloca.s CS$3$0000
L_000a: constrained ConsoleApplication2.Disposable
L_0010: callvirt instance void [mscorlib]System.IDisposable::Dispose()
L_0015: endfinally
L_0016: ret
.try L_0006 to L_0008 finally handler L_0008 to L_0016
}
L_0010
はボクシング操作を導入しますが、実際のbox
命令はここにはありません。
私が尋ねる理由は、おそらく約1〜2年前、私はオンラインで「誰かがコメントした」文の「最適化」を見ていたからです。このケースでは、メソッドでロックが取得されたオブジェクトの短時間ロックの構文としてusingステートメントが使用され、処分されたときにロックが解放されるstructが返された:
using (LockTheObject())
{
// use the object
}
及びコメントが使用される実際の構造体にIDisposable
からLockTheObject
メソッドの戻り型を変更することにより、ボクシングが回避されたことでした。
しかし、これが真実か、それとも真実かは疑問です。
誰でも正しい方向に向けることができますか?ボックス操作を見るために、ランタイムアセンブリコードを調べなければならない場合は、何を探すかの例を示してください。アセンブリコードに精通しているので問題はありませんが、何も飛び出さない私はそれを見て私にも。
は、拘束されたとcallvirtの間の相互作用は、私は感謝、探していたものでした! –