Suffixe littéral pour l'octet dans .NET?


162

Je me demande s'il existe un moyen de déclarer une variable d'octet d'une manière courte comme des flottants ou des doubles? Je veux dire comme 5fet 5d. Bien sûr, je pourrais écrire byte x = 5, mais c'est un peu sans importance si vous utilisez varpour les variables locales.


20
La plupart des gens ici semblent supposer que varc'est le seul cas d'utilisation. Il existe d'autres cas d'utilisation valides. Par exemple byte value = condition ? (byte)5 : (byte)6,.
Hameer Abbasi

@HameerAbbasi dans votre cas, j'irais var value = (byte)(condition ? 5 : 6);.
Shimmy Weitzhandler

Un peu dingue peut-être, mais vous pourriez y aller byte value = condition ? ub5 : ub6;en définissant byte ub5 = 5, ub6 = 6;. hehe
intrepidis

@HameerAbbasi Pourquoi ne le feriez-vous pas byte value = condition ? 5 : 6;?
NetMage

@NetMage Cela n'a pas fonctionné au moment où la question a été publiée.
Hameer Abbasi

Réponses:


147

Il n'y a aucune mention d'un suffixe littéral sur la référence MSDN pour Byte ainsi que dans la spécification du langage C # 4.0 . Les seuls suffixes littéraux en C # sont pour les nombres entiers et réels comme suit:

u = uint
l = long
ul = ulong
f = float
m = decimal
d = double

Si vous souhaitez utiliser var, vous pouvez toujours convertir l'octet comme dansvar y = (byte) 5

Bien que pas vraiment lié, en C # 7, un nouveau préfixe binaire a été introduit 0b, qui indique que le nombre est au format binaire. Cependant, il n'y a toujours pas de suffixe pour en faire un octet, par exemple:

var b = 0b1010_1011_1100_1101_1110_1111; //int

22
0b1010_1011_1100_1101_1110_1111est toujours un Int32bien.
BanksySan

1
Pourriez-vous fournir un lien vers le document C # 7 où il 0best couvert.
user3613932

29

Nous avons donc ajouté des littéraux binaires dans VB l'automne dernier et avons obtenu des commentaires similaires de la part des premiers testeurs. Nous avons décidé d'ajouter un suffixe pour byte pour VB. Nous nous sommes installés sur SB (pour l'octet signé) et UB (pour l'octet non signé). La raison pour laquelle ce n'est pas seulement B et SB est double.

Premièrement, le suffixe B est ambigu si vous écrivez en hexadécimal (que signifie 0xFFB?) Et même si nous avions une solution pour cela, ou un autre caractère que 'B' ('Y' était considéré, F # l'utilise) non on pouvait se rappeler si la valeur par défaut était signée ou non signée - les octets .NET ne sont pas signés par défaut, il serait donc logique de choisir B et SB mais tous les autres suffixes sont signés par défaut, ce qui serait cohérent avec les autres suffixes de type pour choisir B et UB. En fin de compte, nous avons opté pour des SB et UB sans ambiguïté. - Anthony D. Green,

https://roslyn.codeplex.com/discussions/542111

Apparemment, il semble qu'ils ont fait ce mouvement dans VB.NET (pourrait ne pas être publié pour le moment), et ils pourraient l'implémenter dans roslyn pour C # - allez voter, si vous pensez que c'est quelque chose que vous aimeriez. Vous auriez également la possibilité de proposer une syntaxe possible.


1
Le suffixe n'est toujours pas répertorié sur la page MSDN (mise à jour le 20 juillet 2015).
mbomb007

4
Et ne semble toujours pas être implémenté dans VS 2017.
The Photon

2
Ni dans VS 2019. Selon la page MSDN citée ci-dessus (mise à jour 30/01/2018): aucun caractère de type d'identifiant n'existe pour les types de données Boolean, Byte, Char, Date, Object, SByte, Short, UInteger, ULong ou UShort , ou pour tout type de données composite tel que des tableaux ou des structures.
Pona

10

À partir de cette page MSDN, il semblerait que vos seules options soient de lancer explicitement ( var x = (byte)5) ou d'arrêter d'utiliser var...


9
Ce n'est pas seulement une question var. Par exemple,this.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen

@JohnGietzen, exactement! Dans mon cas, c'est Math.Max(myByte, (byte)1). Et BTW, vous pouvez remplacer votre exemple par this.pixels[x, y] = (byte)(condition ? 0 : 1);this.pixels[x, y] = Convert.ToByte(!condition);
:,

Que diriez-vous d'utiliser dans les attributs? par exemple xunit: [InlineData(1)]- [InlineData(1b)]aurait l'air bien mieux que [InlineData((byte)1)](en utilisant seulement 1pourrait lever une exception si le paramètre est nullable byte et vous lui donnez un int)
Matthias Burger

3

Selon MSDN, vous pouvez déclarer un octet en utilisant un littéral décimal, hexadécimal ou binaire.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;

7
Oui, mais byte x; x = predicate ? 0x05 : 0x00;c'est une erreur car le résultat de l'opérateur ternaire est un int.
The Photon

1
@ThePhoton Votre droit! La seule chose que je puisse dire à ce sujet est: WAT! destroyallsoftware.com/talks/wat
Adrian Toman

3
Cela ne répond pas à la question. La question n'est pas de savoir comment puis-je initialiser un octet, mais comment puis-je dire explicitement "c'est un octet". avec var x = 5, x est un entier, avec var x = 5d, x est un double. Lorsque vous utilisez le nombre comme paramètre dans un attribut, cela devient important: un constructeur avec double pourrait faire autre chose qu'un constructeur avec int. (Cela ne devrait peut-être pas, mais cela pourrait). Avec votre réponse, vous ne montrez que les différentes possibilités pour l'initialiser x.
Matthias Burger

@ThePhoton VB.net vous laisse faire ça. Dim x As Byte x = If (prédicat, & H05, & H00)
Brain2000
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.