Буквальний суфікс для байта в .NET?


162

Мені цікаво, чи є який-небудь спосіб оголосити байт-змінну коротким способом, як floats або double? Я маю на увазі, як 5fі 5d. Звичайно , я міг би написати byte x = 5, але це трохи несуттєвим , якщо ви використовуєте varдля локальних змінних.


20
Більшість людей тут вважають, що varце єдиний випадок використання. Є й інші дійсні випадки використання. Наприклад, byte value = condition ? (byte)5 : (byte)6.
Хамер Аббасі

@HameerAbbasi в вашому випадку я б var value = (byte)(condition ? 5 : 6);.
Шиммі Вайцхандлер

Можливо, трохи бонкери, але ви можете піти з byte value = condition ? ub5 : ub6;визначенням byte ub5 = 5, ub6 = 6;. hehe
intrepidis

@HameerAbbasi Чому б ти цього не зробив byte value = condition ? 5 : 6;?
NetMage

@NetMage Це не спрацювало під час опублікування питання.
Хамер Аббасі

Відповіді:


147

Не згадується буквальний суфікс у посиланні MSDN для Байта , а також у мовній специфікації C # 4.0 . Єдині буквальні суфікси в C # призначені для цілих і дійсних чисел:

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

Якщо ви хочете використовувати var, ви завжди можете передати байт як вvar y = (byte) 5

Хоча насправді це не пов’язано, у C # 7 було введено новий бінарний префікс 0b, який повідомляє, що число є у двійковому форматі. Все ж немає суфікса, щоб зробити його байтом, наприклад:

var b = 0b1010_1011_1100_1101_1110_1111; //int

21
0b1010_1011_1100_1101_1110_1111все ще Int32хоч.
BanksySan

1
Чи можете ви надати посилання на документ C # 7, де 0bце висвітлено.
користувач3613932

29

Отже, ми додали бінарні літерали у VB минулої осені та отримали подібні відгуки від ранніх тестерів. Ми все-таки вирішили додати суфікс до байту для VB. Ми розмістилися на SB (для підписаного байта) та UB (для непідписаного байту). Причина це не лише B, а SB - двояка.

По-перше, суфікс B неоднозначний, якщо ви пишете шістнадцятковим (що означає 0xFFB?), І навіть якщо ми мали для цього рішення, або інший символ, ніж "B" ("Y" вважалося, F # використовує це) ні можна було б згадати, чи був підписаний чи непідписаний - .NET байти не підписані за замовчуванням, тому було б доцільно вибрати B і SB, але всі інші суфікси підписані за замовчуванням, так що це було б узгоджено з іншими суфіксами типу для вибору B і UB. Врешті-решт ми пішли на однозначні SB та UB. - Ентоні Д. Грін,

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

Мабуть, здається, що вони зробили цей крок у VB.NET (можливо, зараз не випущено), і вони можуть реалізувати його в росліні за C # - ідіть, проголосуйте, якщо ви думаєте, що це щось хотілося б. Ви також матимете можливість запропонувати можливий синтаксис.


1
Суфікс досі не вказаний на сторінці MSDN (оновлено 20 липня 2015 року).
mbomb007

4
І все ще, здається, не реалізовано у VS 2017.
The Photon

2
Ні у VS 2019. Згідно з цитованою вище сторінкою MSDN (оновлено 30.01.2018): для типів даних Boolean, Byte, Char, Date, Object, SByte, Short, UInteger, ULong або UShort не існує символів типу ідентифікатора або для будь-яких складених типів даних, таких як масиви чи структури.
Пона

10

З цієї сторінки MSDN, здається, що ваші єдині варіанти - це передавання явно ( var x = (byte)5) або припинення використання var...


9
Справа не лише в тому var. Наприклад,this.pixels[x, y] = condition ? (byte)0 : (byte)1;
Джон Гітцен

@JohnGietzen, точно! У моєму випадку це Math.Max(myByte, (byte)1). І BTW, ви можете замінити свій приклад на:, this.pixels[x, y] = (byte)(condition ? 0 : 1);що мені виглядає трохи приємніше, абоthis.pixels[x, y] = Convert.ToByte(!condition);
Shimmy Weitzhandler

Як щодо використання в атрибутах? напр., xunit: [InlineData(1)]- [InlineData(1b)]виглядав би набагато краще, ніж [InlineData((byte)1)](використовуючи лише 1міг би викинути виняток, якщо параметр є нульовим байтом, і ви дасте йому int)
Matthias Burger

3

Відповідно до MSDN, ви можете оголосити байт, використовуючи десятковий, шістнадцятковий або двійковий літерал.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;

7
Так, але byte x; x = predicate ? 0x05 : 0x00;це помилка, оскільки результат потрійного оператора - це int.
The Photon

1
@ThePhoton Ваше право! Єдине, що я можу сказати на це, це: ВАТ! killallsoftware.com/talks/wat
Адріан Томан

3
Це не дає відповіді на запитання. Питання полягає не в тому, як я можу ініціалізувати байт, а в тому, як я можу явно сказати "це байт". з var x = 5, x - це int, з var x = 5d, x - подвійний. При використанні числа в якості параметра в атрибуті це стає важливим: конструктор з подвійним може зробити щось інше, ніж конструктор з int. (Можливо, не повинно, але може). Своєю відповіддю ти лише показуєш різні можливості ініціалізувати це x.
Маттіас Бургер

@ThePhoton VB.net давайте зробимо це. Dim x As Byte x = If (присудок, & H05, & H00)
Brain2000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.