Literales Suffix für Byte in .NET?

161

Ich frage mich, ob es eine Möglichkeit gibt, eine Byte-Variable auf kurze Weise wie Floats oder Doubles zu deklarieren. Ich meine wie 5fund 5d. Sicher könnte ich schreiben byte x = 5, aber das ist ein bisschen belanglos, wenn Sie varfür lokale Variablen verwenden.

Matthias
quelle
20
Die meisten Leute hier scheinen anzunehmen, dass dies varder einzige Anwendungsfall ist. Es gibt andere gültige Anwendungsfälle. Zum Beispiel byte value = condition ? (byte)5 : (byte)6.
Hameer Abbasi
@HameerAbbasi in deinem Fall würde ich gehen var value = (byte)(condition ? 5 : 6);.
Shimmy Weitzhandler
Ein bisschen verrückt vielleicht, aber Sie könnten mit byte value = condition ? ub5 : ub6;definieren gehen byte ub5 = 5, ub6 = 6;. hehe
intrepidis
@HameerAbbasi Warum würdest du es nicht einfach tun byte value = condition ? 5 : 6;?
NetMage
@NetMage Das hat zum Zeitpunkt der Veröffentlichung der Frage nicht funktioniert.
Hameer Abbasi

Antworten:

146

In der MSDN-Referenz für Byte sowie in der C # 4.0-Sprachspezifikation wird kein Literal-Suffix erwähnt . Die einzigen Literal-Suffixe in C # sind für ganzzahlige und reelle Zahlen wie folgt:

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

Wenn Sie verwenden möchten var, können Sie das Byte jederzeit wie in umwandelnvar y = (byte) 5

Obwohl nicht wirklich verwandt, wurde in C # 7 ein neues binäres Präfix eingeführt 0b, das besagt, dass die Zahl im binären Format vorliegt. Es gibt jedoch kein Suffix, um es zu einem Byte zu machen. Beispiel:

var b = 0b1010_1011_1100_1101_1110_1111; //int
Matt
quelle
21
0b1010_1011_1100_1101_1110_1111ist immer noch ein Int32obwohl.
BanksySan
1
Könnten Sie einen Link zu dem C # 7-Dokument bereitstellen, in dem 0bes behandelt wird?
user3613932
29

Deshalb haben wir im letzten Herbst binäre Literale in VB hinzugefügt und ähnliche Rückmeldungen von frühen Testern erhalten. Wir haben beschlossen, ein Suffix für Byte für VB hinzuzufügen. Wir haben uns für SB (für vorzeichenbehaftetes Byte) und UB (für vorzeichenloses Byte) entschieden. Der Grund, warum es nicht nur B und SB ist, ist zweifach.

Erstens ist das B-Suffix mehrdeutig, wenn Sie hexadezimal schreiben (was bedeutet 0xFFB?) Und selbst wenn wir eine Lösung dafür hatten oder ein anderes Zeichen als 'B' ('Y' wurde berücksichtigt, F # verwendet dies) Nr Man könnte sich daran erinnern, ob der Standard signiert oder nicht signiert war - .NET-Bytes sind standardmäßig nicht signiert, daher wäre es sinnvoll, B und SB auszuwählen, aber alle anderen Suffixe sind standardmäßig signiert, damit sie mit anderen Typ-Suffixen für B und übereinstimmen UB. Am Ende haben wir uns für SB und UB entschieden. - Anthony D. Green,

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

Anscheinend haben sie diesen Schritt in VB.NET gemacht (möglicherweise noch nicht veröffentlicht) und ihn möglicherweise in Roslyn für C # implementiert. Geben Sie Ihre Stimme ab, wenn Sie der Meinung sind, dass dies etwas ist, das Sie möchten. Sie hätten auch die Möglichkeit, eine mögliche Syntax vorzuschlagen.

Erti-Chris Eelmaa
quelle
1
Das Suffix ist immer noch nicht auf der MSDN-Seite aufgeführt (aktualisiert am 20. Juli 2015).
mbomb007
4
Und scheint immer noch nicht in VS 2017 implementiert zu sein.
The Photon
2
Noch in VS 2019. Gemäß der oben genannten MSDN-Seite (aktualisiert am 30.01.2008): Für die
Pona
10

Auf dieser MSDN-Seite scheint es, dass Ihre einzigen Optionen darin bestehen, explizit ( var x = (byte)5) zu konvertieren oder die Verwendung von var...

Dan Puzey
quelle
9
Es geht nicht nur darum var. Zum Beispielthis.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen
@ JohnGietzen, genau! In meinem Fall ist es Math.Max(myByte, (byte)1). Und übrigens, Sie können Ihr Beispiel ersetzen durch this.pixels[x, y] = (byte)(condition ? 0 : 1);this.pixels[x, y] = Convert.ToByte(!condition);
:,
Wie wäre es mit der Verwendung in Attributen? zB xunit: [InlineData(1)]- [InlineData(1b)]würde viel besser aussehen als [InlineData((byte)1)](mit using 1könnte nur eine Ausnahme ausgelöst werden, wenn der Parameter ein nullbares Byte ist und Sie ihm ein int geben)
Matthias Burger
3

Wie pro MSDN können Sie ein Byte mit einem dezimal, hexadezimal oder binär wörtlichen deklarieren.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;
Adrian Toman
quelle
7
Ja, aber es byte x; x = predicate ? 0x05 : 0x00;ist ein Fehler, da das Ergebnis des ternären Operators ein int ist.
Das Photon
1
@ ThePhoton Du hast Recht! Das einzige, was ich dazu sagen kann, ist: WAT! destroyallsoftware.com/talks/wat
Adrian Toman
3
Dies beantwortet die Frage nicht. Bei der Frage geht es nicht darum, wie ich ein Byte initialisieren kann, sondern darum, wie ich explizit sagen kann, dass es ein Byte ist. mit var x = 5, x ist ein int, mit var x = 5d, x ist ein double. Wenn Sie die Zahl als Parameter in einem Attribut verwenden, wird dies wichtig: Ein Konstruktor mit double kann etwas anderes als einen Konstruktor mit int tun. (Es sollte nicht, aber es könnte). Mit Ihrer Antwort zeigen Sie nur die verschiedenen Möglichkeiten, dies zu initialisieren x.
Matthias Burger
@ThePhoton VB.net lass dich das machen. Dim x As Byte x = If (Prädikat, & H05, & H00)
Brain2000