Je suis tombé sur un bug dans un code qui ne se reproduit que lorsque le code est construit avec les optimisations activées. J'ai créé une application console qui reproduit la logique à des fins de test (code ci-dessous). Vous verrez que lorsque l'optimisation est activée, 'value' devient nul après l'exécution de cette logique invalide :
if ((value == null || value == new string[0]) == false)
La correction est simple et est commentée sous le code incriminé. Mais... Je suis plus préoccupé par le fait que j'ai peut-être rencontré un bogue dans l'assembleur ou peut-être que quelqu'un d'autre a une explication de la raison pour laquelle la valeur devient nulle.
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);
//}
}
}
}
}
La sortie normale devrait être :
Pre-check Value is: System.String[]
Post-check Value is: System.String[]
Key is: blah
Value is: System.String[]
La sortie boguée est :
Pre-check Value is: System.String[]
Post-check Value is:
Key is: blah
Value is:
Mon Env est une VM exécutant Windows Server 2003 R2 avec .NET 3.5 SP1. J'utilise le système d'équipe VS2008.
Merci,
Brian