2015-08-15 5 views
14

J'ai écrit ma propre classe qui convertit les primitives standard C# en tableaux d'octets.Comment fonctionne la fonction GetBytes?

Plus tard, j'ai jeté un oeil à la BitConverter classe source, pour voir comment les pros l'ont fait.

Mon exemple de code:

public static byte[] getBytes(short value) { 
    byte[] bytes = new byte[2]; 

    bytes[0] = (byte)(value >> 8); 
    bytes[1] = (byte)value; 

    return bytes; 
} 

BitConverter code de classe:

public unsafe static byte[] GetBytes(short value) 
{ 
    byte[] bytes = new byte[2]; 
    fixed(byte* b = bytes) 
     *((short*)b) = value; 
    return bytes; 
} 

Pourquoi leurs fonctions taggés comme opérateur dangereux et l'utilisation fixe?

Ces fonctions sont-elles sujettes aux erreurs même si elles ne sont pas sécurisées? Devrais-je simplement laisser tomber le mien et utiliser leur mise en œuvre? Lequel est le plus efficace?

+3

Ces fonctions font des choses différentes: la première utilise le gros boutiste, le dernier endian. – CodesInChaos

Répondre

12

Oui, déposez le vôtre et utilisez la bibliothèque standard.

Il est plus efficace car il copie les deux octets en même temps en convertissant le tableau d'octets en un pointeur court. Pour ce faire, il nécessite fixed pour permettre l'utilisation de pointeurs, et donc le mot-clé dangereux.

Il est généralement préférable d'éviter le code dangereux dans vos propres assemblages, car cela signifie que votre code ne peut pas être garanti sûr, et ne peut donc être exécuté que dans des environnements entièrement fiables. Cependant, étant donné que Bitconverter fait partie des assemblys .Net standard signés par Microsoft, Windows sait que tout va bien.

Les fonctions de la bibliothèque sont également moins sujettes aux erreurs, car elles ont été durcies par des millions de développeurs qui les utilisent tous les jours, alors que votre fonction n'a été testée que par vous.

+0

Cela a du sens, je suppose que je devrais seulement créer des wrappers autour de la classe BitConverter, tels que GetBytes de la chaîne. – Scavs

+3

@Scavs For 'String' vous devez utiliser' System.Text.Encoding.GetBytes' (https://msdn.microsoft.com/en-us/library/system.text.encoding.getbytes(v=vs.110) .aspx), pas BitConverter. – Rotem

+0

Vous avez raison, je suppose que je devrais couper la chose "réinventer la roue". – Scavs