Y a-t-il une différence entre les deux morceaux de code suivants?
class Test {
public readonly double Val;
public Test(bool src) {
this.Val = src ? 1 : 0;
}
}
class Test {
public readonly double Val;
public Test(bool src) {
this.Val = src ? 1D : 0D;
}
}
J'ai trouvé que notre base de code utilise la deuxième façon d'écrire.
Réponses:
Il y a deux questions ici et il est important de noter qu'elles ont des réponses différentes.
Non. Le compilateur C # reconnaît quand un littéral entier est utilisé dans un contexte où un double est attendu et modifie le type au moment de la compilation, donc ces deux fragments généreront le même code.
Oui. La règle selon laquelle les constantes entières sont automatiquement remplacées par des doubles ne s'applique qu'aux constantes et
src ? ...
n'est pas une constante . Le compilateur générera le premier comme si vous aviez écrit:Et le second comme
Autrement dit, dans le premier, nous choisissons un entier, puis le convertissons en double, et dans le second, nous choisissons un double.
Pour info: le compilateur C # ou la gigue sont autorisés à reconnaître que le premier programme peut être optimisé dans le second, mais je ne sais pas s'il le fait réellement. Le compilateur C # ne déplace parfois des conversions pour soulever l' arithmétique dans les corps de conditionals; J'ai écrit ce code il y a environ huit ans maintenant, mais je ne me souviens pas de tous les détails.
la source
Il existe une différence dans le code IL généré.
Cette classe:
Produit ce code IL pour le constructeur:
Et cette classe:
Produit ce code IL pour le constructeur:
Comme vous pouvez le voir, dans la première version, il doit appeler
conv.r8
pour convertir un int en double.Cependant: (1) Le résultat final est identique et (2) le compilateur JIT peut bien traduire les deux dans le même code machine.
La réponse est donc: oui, il y a une différence - mais pas celle dont vous devez vous inquiéter.
Personnellement, j'opterais pour la deuxième version car cela exprime mieux l'intention du programmeur et peut produire un code très très légèrement plus efficace (en fonction de ce que le compilateur JIT obtient).
la source
Il n'y a aucune différence, le compilateur est suffisamment intelligent pour effectuer implicitement une conversion ou non.
Cependant, si vous utilisez
var
, vous devez écrirevar val = 42D;
pour vous assurer que la variable est un double et non un int.la source