Le champ LittleEndian signale-t-il faux, mais il doit s’agir d’un peu endien?

Je cours sur un ordinateur Intel (Win7 64 bits) et, d’après mes lectures, Intel utilise Little-Endian. J’essaie ceci en C # avec le code suivant:

byte[] b2 = new byte[] { 0, 1 }; short b2short = BitConverter.ToInt16(b2, 0); 

et b2short == 256 comme prévu d’un Little Endian.

Ensuite, j’ai lu que, dans .NET, BitConverter.IsLittleEndian devrait refléter ce que le système utilise, et lorsque je vérifie la variable dans Visual Studio, il renvoie false , c’est-à-dire qu’il n’est PAS Little-Endian.

Est-ce que cela a quelque chose à voir avec le système d’exploitation 64 bits? Des idées?


EDIT: Mon collègue, qui est assis en face de moi, a fait le même test (Win Vista 32 bits) et obtenu les mêmes résultats


EDIT 2: C’est vraiment étrange. À chaque fois que je lance le code et que je me casse après que BitConverter ait fait son travail, IsLittleEndian == false. MAIS, si j’ajoute la ligne Console.WriteLine (BitConverter.IsLittleEndian); après c’est vrai:

 byte[] b2 = new byte[] { 0, 1 }; short b2short = BitConverter.ToInt16(b2, 0); Console.WriteLine(BitConverter.IsLittleEndian); // Now the IsLittleEndian is true 

Mais une fois que je supprime Console.WriteLine, il est à nouveau faux .

Je peux aussi append que même si je casse sur le “Console.WriteLine” IsLittleEndian == true, mais si je supprime complètement la ligne, elle est false.


EDIT 3: Comme Mark Gravell l’a souligné, cela doit être un bug de synchronisation. Si j’utilise la variable BitConverter.IsLittleEndian, il est initialisé, si je ne le fais pas (et le regarde quand il casse), il n’est pas initialisé et donc faux

Je me demande s’il s’agit d’un bogue de synchronisation, lié peut-être à “beforefieldinit” … comment voyez-vous la valeur? Il est possible que l’initialisateur de type (pour BitConverter ) ne soit pas déclenché par le débogueur du VS (qui se trouve sous les couvertures, pour ainsi dire). D’autant que false est la valeur par défaut pour un champ …

Le IsLittleEndian statique IsLittleEndian est défini dans le constructeur statique. et le temps d’exécution d’un initialiseur est … très difficile à prédire. Si vous utilisez un débogueur, tous les paris sont désactivés. Le seul moyen de vérifier de manière fiable la valeur de ce champ consiste à utiliser un code (lorsque le CLR exécutera l’initialiseur à un moment donné avant qu’il ne soit requirejs):

 bool isLittleEndian = BitConverter.IsLittleEndian; 

Ne faites pas confiance au débogueur / surveillez les fenêtres, etc.

Raymond Chen donne une réponse élargie à la question .

L’essentiel est que:

La lecture d’un membre à partir du débogueur n’exécute pas le code pour initialiser ce membre.

Ainsi, lorsque vous consultez le champ dans Visual Studio, il indique false car l’initialiseur statique n’a pas encore été exécuté. Toutefois, si vous utilisez le champ dans le code, l’initialiseur statique s’exécutera et le champ renverra la valeur correcte actuelle.

Comment allez-vous le vérifier?

Par exemple, exécutez cette courte application de console:

 using System; public class Test { static void Main() { Console.WriteLine(BitConverter.IsLittleEndian); } } 

Qu’est-ce que cela imprime? Pourriez-vous donner des détails sur le matériel et le système d’exploitation que vous utilisez?

Comme Marc dit, cela semble être un problème de synchronisation. L’utilisation du débogueur VS pour “visualiser” la valeur au démarrage renvoie false, mais si je l’imprime dans une boîte de message, elle renvoie true.