La conversion d'octets de GO en C#?
J'ai été refactoring quelques vieux code et est venu à travers la ligne de code suivante pour convertir les octets de GO.
decimal GB = KB / 1024 / 1024 / 1024;
Est-il un meilleur moyen de refactoriser le code suivant?
mise à Jour
Je voulais dire octets de Gigaoctets. J'ai donné des informations erronées.
decimal GB = KB / 1024 / 1024;
serait mieux...- Outre un supplément de division, il n'y a rien de mal avec le code écrit; il est parfaitement clair dans ses intentions, pas inutilement verbeux, et il n'y a aucune perf problèmes. Pourquoi voudriez-vous refactoriser le code?
- Je pense que c'est bien, mais je serais probablement GO = octets * 1E-9;
- Désolé d'être ce gars-là, mais c'est gibibytes pas gigaoctets.
Vous devez vous connecter pour publier un commentaire.
J'ai développé cette méthode ici, fonctionne jusqu'à la TUBERCULOSE.
Si la précision n'est pas importante, l'utilisation double:
D'accord avec Pavel ici - il n'y a pas vraiment besoin de revoir ce code... en fait, si c'est le plus gros problème dans votre base de code, je pense que vous pourriez être assis sur la plupart des écrits logiciel jamais.
Le code d'origine est concis, facile à lire, et avec suffisamment de noms de variables, de l'auto-documentation; je ne changerai pas.
Si vous devez absolument refactoriser, vous pouvez créer un ensemble de méthodes d'extension sur les types numériques:
Mais à moins que votre code ne fait pratiquement rien, mais de convertir les octets de kilo-octets, etc, tout cela va vraiment faire est d'encombrer Intellisense pour aucun gain réel.
Personnellement je préfère l'écrire comme ceci:
decimal GB = KB /(1024 * 1024);
mais il n'y a vraiment pas besoin de refactoriser le code écrit.Bien, la formule est fausse (il n'y a qu'environ un million de kilo-octets dans un gigaoctet, pas un millier de millions de dollars), mais, à part ça, c'est très bien. Quiconque a l'habitude de travailler avec ces numéros de savoir ce qu'il signifie.
Une chose que je voudrais regarder (et je ne sais pas si c'est un problème avec C#) est qu'un compilateur peut ne pas être en mesure d'optimiser la
x/1024/1024
six
n'est pas un type de base. Avec C et entiers, le compilateur aurait assez facilement le transformer en un "absolument-rapide-shift-droit-par-20-bits" de l'enseignement.Si la décimale est une classe plutôt que d'un type de base, le compilateur peut avoir à faire deux opérations de division. Si cela a un réel impact sur la vitesse (ou même s'il arrive à tous) est en dehors de ma sphère de la connaissance.
Une chose que je voudrais examiner en train de changer les noms de variable réels. Il ne fait aucune différence pour le code compilé, mais je préfère plus les noms de variables plutôt que des abréviations, donc je préfère
kiloBytes/gigaBytes
ou quelque chose comme ça.KB/GB
est trop facile de se confondre avec des constantes, en fonction de vos normes de codage.En théorie, c'est plus rapide (precomputing la constante de multiplication au lieu de la division). Ce n'est probablement pas utilisé assez souvent à la matière, mais juste au cas où.
J'ai écrit un petit utilitaire de la classe qui effectue des conversions entre les unités, hth..
Pour s'assurer que le compilateur pré-calcule les diviseurs:
Note que vous êtes en fait, le calcul GiB (gibibyte), pas GO (gigaoctet). Si vous voulez vraiment calculer GO, ce serait:
J'en avais besoin, à l'inverse, convertir de la 3ème partie de la composante littérale de la taille en mots (par exemple "0 octets", "1.1 MO") dans le générique de la taille en octets. je l'ai donc utilisé de cette façon:
C'est un peu d'amélioration de la bonne JLopez de la réponse (s'il vous plaît VOTER LUI, pas moi).
Ici, vous pouvez choisir d'avoir ou non des unités de l'indication et le kilo unité est écrit avec la minuscule "k" (la majuscule est de Kelvin)