Я столкнулся с ошибкой в коде, который воспроизводится только тогда, когда код построен с включенными оптимизациями. Я создал консольное приложение, которое реплицирует логику тестирования (код ниже). Вы увидите, что когда оптимизация включена, значение "value" становится нулевым после выполнения этой недействительной логики:
if ((value == null || value == new string[0]) == false)
Исправление является прямым и прокомментировано ниже кода нарушения. Но... меня больше беспокоит, что я, возможно, столкнулся с ошибкой в ассемблере или, возможно, у кого-то есть объяснение, почему значение получает значение null.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace memory_testing
{
class Program
{
sta tic void Main(string[] args)
{
while(true)
{
Console.Write("Press any key to start...");
Console.ReadKey();
Console.WriteLine();
PrintManagerUser c = new PrintManagerUser();
c.MyProperty = new string[1];
}
}
}
public class PrintManager
{
public void Print(string key, object value)
{
Console.WriteLine("Key is: " + key);
Console.WriteLine("Value is: " + value);
}
}
public class PrintManagerUser
{
public string[] MyProperty
{
get { return new string[100]; }
set
{
Console.WriteLine("Pre-check Value is: " + value);
if ((value == null || value == new string[0]) == false)
{
Console.WriteLine("Post-check Value is: " + value);
new PrintManager().Print("blah", value);
}
//if (value != null && value.Length > 0)
//{
// new PrintManager().Print("blah", value);
//}
}
}
}
}
Нормальный выход должен быть:
Pre-check Value is: System.String[]
Post-check Value is: System.String[]
Key is: blah
Value is: System.String[]
Выход с ошибкой:
Pre-check Value is: System.String[]
Post-check Value is:
Key is: blah
Value is:
My Env - это виртуальная машина под управлением Windows Server 2003 R2 с .NET 3.5 SP1. Использование VS2008 Team System.
Спасибо,
Брайан