Suffisso letterale per byte in .NET?


162

Mi chiedo se c'è un modo per dichiarare una variabile byte in modo breve come float o double? Intendo come 5fe 5d. Certo che potrei scrivere byte x = 5, ma è un po 'irrilevante se lo usi varper le variabili locali.


20
La maggior parte delle persone qui sembrano supporre che varsia l'unico caso d'uso. Esistono altri casi d'uso validi. Ad esempio byte value = condition ? (byte)5 : (byte)6,.
Hameer Abbasi,

@HameerAbbasi nel tuo caso andrei var value = (byte)(condition ? 5 : 6);.
Shimmy Weitzhandler,

Forse un po 'fuori di testa, ma potresti byte value = condition ? ub5 : ub6;definirlo byte ub5 = 5, ub6 = 6;. hehe
intrepidis,

@HameerAbbasi Perché non dovresti farlo byte value = condition ? 5 : 6;?
NetMage,

@NetMage Non funzionava al momento della pubblicazione della domanda.
Hameer Abbasi,

Risposte:


147

Non si fa menzione di un suffisso letterale sul riferimento MSDN per Byte e nella specifica del linguaggio C # 4.0 . Gli unici suffissi letterali in C # sono per numeri interi e reali come segue:

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

Se si desidera utilizzare var, è sempre possibile eseguire il cast del byte come invar y = (byte) 5

Sebbene non sia realmente correlato, in C # 7 è stato introdotto un nuovo prefisso binario 0b, che indica che il numero è in formato binario. Tuttavia non esiste alcun suffisso per renderlo un byte, ad esempio:

var b = 0b1010_1011_1100_1101_1110_1111; //int

22
0b1010_1011_1100_1101_1110_1111è ancora un Int32pensiero.
BanksySan

1
Potresti fornire un link al documento C # 7 dove 0bè coperto.
user3613932

29

Quindi, abbiamo aggiunto letterali binari in VB lo scorso autunno e abbiamo ottenuto un feedback simile dai primi tester. Abbiamo deciso di aggiungere un suffisso per byte per VB. Abbiamo optato per SB (per byte con segno) e UB (per byte senza segno). Il motivo non è solo B e SB è duplice.

Primo, il suffisso B è ambiguo se stai scrivendo in formato esadecimale (cosa significa 0xFFB?) E anche se avessimo una soluzione per questo o un carattere diverso da "B" (è stato considerato "Y", F # lo usa) no si potrebbe ricordare se l'impostazione predefinita era firmata o non firmata: i byte .NET sono non firmati per impostazione predefinita, quindi avrebbe senso scegliere B e SB ma tutti gli altri suffissi sono firmati per impostazione predefinita, quindi sarebbe coerente con altri suffissi di tipo per scegliere B e UB. Alla fine abbiamo scelto SB e UB senza ambiguità. - Anthony D. Green,

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

Apparentemente, sembra che abbiano fatto questa mossa in VB.NET (potrebbe non essere rilasciato in questo momento), e potrebbero implementarlo in roslyn per C # - vai a dare il tuo voto, se pensi che sia qualcosa che ti piacerebbe. Avresti anche la possibilità di proporre una possibile sintassi.


1
Il suffisso non è ancora elencato nella pagina MSDN (aggiornato il 20 luglio 2015).
mbomb007,

4
E non sembra ancora essere implementato in VS 2017.
The Photon,

2
Né in VS 2019. Secondo la pagina MSDN citata sopra (aggiornato il 30/01/2018): non esistono caratteri di tipo identificativo per i tipi di dati Booleano, Byte, Char, Date, Object, SByte, Short, UInteger, ULong o UShort o per qualsiasi tipo di dati composito come matrici o strutture.
Pona,

10

Da questa pagina MSDN, sembrerebbe che le tue uniche opzioni siano di lanciare esplicitamente ( var x = (byte)5) o smettere di usare var...


9
Non si tratta solo di var. Ad esempio,this.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen,

@JohnGietzen, esattamente! Nel mio caso lo è Math.Max(myByte, (byte)1). E a proposito, puoi sostituire il tuo esempio a this.pixels[x, y] = (byte)(condition ? 0 : 1);this.pixels[x, y] = Convert.ToByte(!condition);
:,

Che ne dici di usare gli attributi? ad es. xunit: [InlineData(1)]- [InlineData(1b)]apparirebbe molto meglio di [InlineData((byte)1)](l'utilizzo di solo 1potrebbe generare un'eccezione se il parametro è un byte nullable e gli dai un int)
Matthias Burger

3

Come da MSDN è possibile dichiarare un byte usando un valore letterale decimale, esadecimale o binario.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;

7
Sì, ma byte x; x = predicate ? 0x05 : 0x00;è un errore perché il risultato dell'operatore ternario è un int.
Il fotone

1
@ThePhoton Il tuo diritto! L'unica cosa che posso dire è: WAT! destroyallsoftware.com/talks/wat
Adrian Toman,

3
Questo non risponde alla domanda. La domanda non riguarda come posso inizializzare un byte, ma come posso dire esplicitamente "è un byte". con var x = 5, x è un int, con var x = 5d, x è un doppio. Quando si utilizza il numero come parametro in un attributo questo diventa importante: un costruttore con double potrebbe fare qualcos'altro che un costruttore con int. (Potrebbe non dovrebbe, ma potrebbe). Con la tua risposta, mostri solo le diverse possibilità di inizializzarla x.
Matthias Burger,

@ThePhoton VB.net ti permette di farlo. Dim x As Byte x = If (predicato, & H05, & H00)
Brain2000
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.