class A
{
   public int m_a;
}
void fun(ref int a)
{
   ...
}
fun(ref new A().m_a);
楽しみながら、「ref int a」は、楽しみから戻る前にオブジェクト(new A())が再利用されないようにするにはどうすればよいですか?
<example 0>
using System;
class A
{
    public int m_a;
    ~A()
    {
        Console.WriteLine("~A()");
    }
}
class Program
{
    static void fun(ref int a)
    {
        Console.WriteLine("Begin<<<<<<<<<<<<<<");
        a++;
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Console.WriteLine("End>>>>>>>>>>>>>>>>>");
    }
    static void Main(string[] args)
    {
        fun(ref new A().m_a);
        Console.WriteLine("Over");
    }
}
output:
Begin<<<<<<<<<<<<<<
~A()
End>>>>>>>>>>>>>>>>>
Over
<example 1>
using System;
class A
{
    public int m_a;
    ~A()
    {
        Console.WriteLine("~A()");
    }
}
class Program
{
    static void fun(ref int a)
    {
        Console.WriteLine("Begin<<<<<<<<<<<<<<");
        a++;
        GC.Collect();
        GC.WaitForPendingFinalizers();
        //add a code
        a++;
        Console.WriteLine("End>>>>>>>>>>>>>>>>>");
    }
    static void Main(string[] args)
    {
        fun(ref new A().m_a);
        Console.WriteLine("Over");
    }
}
output:
Begin<<<<<<<<<<<<<<
End>>>>>>>>>>>>>>>>>
Over
~A()
VSのリリースモードでビルドしてください。ASMコードを表示すると、2行だけが追加されます。
             a++;
0000002f  mov         eax,dword ptr [ebp-4] 
00000032  inc         dword ptr [eax] 
2つの例の間の他の部分は同じです。GCは、変数aがマシンコードで役に立たなくなったことをどのように確認しますか?