Dosłowny sufiks dla bajtu w .NET?

162

Zastanawiam się, czy istnieje sposób na zadeklarowanie zmiennej bajtowej w krótki sposób, na przykład zmiennoprzecinkowy lub podwójny? Mam na myśli jak 5fi 5d. Jasne, że mógłbym napisać byte x = 5, ale to trochę nieistotne, jeśli używasz vardla zmiennych lokalnych.

Matthias
źródło
20
Większość ludzi uważa, że varjest to jedyny przypadek użycia. Istnieją inne ważne przypadki użycia. Na przykład byte value = condition ? (byte)5 : (byte)6.
Hameer Abbasi
@HameerAbbasi w twoim przypadku poszedłbym var value = (byte)(condition ? 5 : 6);.
Shimmy Weitzhandler
Może trochę dziwaczne, ale możesz się z tym pogodzić, byte value = condition ? ub5 : ub6;definiując byte ub5 = 5, ub6 = 6;. hehe
intrepidis
@HameerAbbasi Dlaczego po prostu nie zrobiłbyś byte value = condition ? 5 : 6;?
NetMage
@NetMage To nie działało w momencie wysłania pytania.
Hameer Abbasi

Odpowiedzi:

147

Nie ma wzmianki o dosłownym sufiksie w odwołaniu MSDN dla Byte, a także w specyfikacji języka C # 4.0 . Jedyne dosłowne sufiksy w języku C # dotyczą liczb całkowitych i rzeczywistych w następujący sposób:

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

Jeśli chcesz użyć var, zawsze możesz rzutować bajt jako wvar y = (byte) 5

Chociaż nie jest to tak naprawdę powiązane, w C # 7 wprowadzono nowy prefiks binarny 0b, który stwierdza, że ​​liczba jest w formacie binarnym. Nadal jednak nie ma sufiksu, który mógłby uczynić go bajtem, przykład:

var b = 0b1010_1011_1100_1101_1110_1111; //int
Matt
źródło
21
0b1010_1011_1100_1101_1110_1111jest jednak nadal Int32.
BanksySan
1
Czy możesz podać link do dokumentu C # 7, w którym 0bjest omówiony.
user3613932
29

Więc zeszłej jesieni dodaliśmy literały binarne w VB i otrzymaliśmy podobne opinie od pierwszych testerów. Zdecydowaliśmy się dodać sufiks dla bajtu dla VB. Zdecydowaliśmy się na SB (dla bajtu ze znakiem) i UB (dla bajtu bez znaku). Powód, dla którego to nie tylko B, a SB jest dwojaki.

Po pierwsze, przyrostek B jest niejednoznaczny, jeśli piszesz szesnastkowo (co oznacza 0xFFB?) I nawet gdybyśmy mieli na to rozwiązanie lub inny znak niż „B” (rozważano „Y”, F # używa tego) nie można było zapamiętać, czy wartość domyślna była podpisana czy niepodpisana - bajty .NET są domyślnie bez znaku, więc warto wybrać B i SB, ale wszystkie inne sufiksy są domyślnie podpisane, więc byłoby zgodne z innymi sufiksami typu, aby wybrać B i UB. Ostatecznie postawiliśmy na jednoznaczne SB i UB. - Anthony D. Green,

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

Najwyraźniej wydaje się, że zrobili ten ruch w VB.NET (może nie zostać teraz wydany) i mogą zaimplementować go w Roslyn dla C # - idź oddać swój głos, jeśli uważasz, że to jest coś, co chcesz. Miałbyś również szansę zaproponować możliwą składnię.

Erti-Chris Eelmaa
źródło
1
Sufiks nadal nie jest wymieniony na stronie MSDN (aktualizacja 20 lipca 2015 r.).
mbomb007
4
I nadal nie wydaje się być zaimplementowany w VS 2017.
Photon
2
Ani w VS 2019. Zgodnie z cytowaną powyżej stroną MSDN (aktualizacja 30.01.2018): Nie istnieją żadne znaki typu identyfikatora dla typów danych Boolean, Byte, Char, Date, Object, SByte, Short, UInteger, ULong lub UShort lub dla dowolnych złożonych typów danych, takich jak tablice lub struktury.
Pona,
10

Na tej stronie MSDN wydaje się, że jedynymi opcjami są jawne rzutowanie ( var x = (byte)5) lub zaprzestanie używania var...

Dan Puzey
źródło
9
Nie chodzi tylko o var. Na przykładthis.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen
@JohnGietzen, dokładnie! W moim przypadku tak Math.Max(myByte, (byte)1). A tak przy okazji, możesz zamienić swój przykład na this.pixels[x, y] = (byte)(condition ? 0 : 1);this.pixels[x, y] = Convert.ToByte(!condition);
:,
A co z wykorzystaniem atrybutów? np xUnit: [InlineData(1)]- [InlineData(1b)]będzie wyglądać lepiej niż [InlineData((byte)1)](używając tylko 1mógł rzucić wyjątek, jeśli parametr jest pustych bajtów i nadać mu int)
Matthias Burger
3

Zgodnie z MSDN możesz zadeklarować bajt za pomocą literału dziesiętnego, szesnastkowego lub binarnego.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;
Adrian Toman
źródło
7
Tak, ale byte x; x = predicate ? 0x05 : 0x00;jest to błąd, ponieważ wynikiem operatora trójskładnikowego jest int.
The Photon
1
@ThePhoton Twoje prawo! Jedyne, co mogę na to powiedzieć, to: WAT! Destroyallsoftware.com/talks/wat
Adrian Toman
3
To nie odpowiada na pytanie. Pytanie nie dotyczy tego, jak mogę zainicjować bajt, ale jak mogę wyraźnie powiedzieć „to bajt”. gdzie var x = 5, x jest int, gdzie var x = 5d, x jest podwójnym. Kiedy używasz liczby jako parametru w atrybucie, staje się to ważne: konstruktor z double mógłby zrobić coś innego niż konstruktor z int. (Może nie powinno, ale może). W swojej odpowiedzi pokazujesz tylko różne możliwości zainicjowania tego x.
Matthias Burger
@ThePhoton VB.net pozwala ci to zrobić. Dim x As Byte x = If (predykat, & H05, & H00)
Brain2000