Следующий код ведет себя по-разному, когда он построен в режиме Release (или отладка с оптимизацией) и запускается без подключенного отладчика Visual Studio.
Похоже, что репликация возможна только при использовании x86 JITter. Я тестировал это на машине x86, а также работал в WOW64 на машине x64 (установив целевую платформу на x86).
Я пробовал это только с .NET 4.0.
При работе вне отладчика в Release я вижу:
Value is 4
При запуске внутри отладчика часть e.Value.Length
Вызов WriteLine
вызывает NullReferenceException
, чего я и ожидал.
Код:
namespace Test
{
class UsingReleasable<T>
{
public UsingReleasable(T obj)
{
m_obj = obj;
}
public T Release()
{
T tmp = m_obj;
m_obj = default(T);
return tmp;
}
public T Value
{
get { return m_obj; }
}
T m_obj;
}
class Program
{
static void Main(string[] args)
{
var e = new UsingReleasable<string>("test");
e.Release();
System.Console.WriteLine("Value is {0}", e.Value.Length);
}
}
}
Мой просмотр кода, созданного JIT, заставляет меня думать, что это ошибка в этот фрагмент, но я хотел дважды проверить здесь, прежде чем пересылать его в MS Connect.