Akhiran literal untuk byte dalam .NET?

162

Saya bertanya-tanya apakah ada cara untuk mendeklarasikan variabel byte dengan cara singkat seperti mengapung atau menggandakan? Maksud saya suka 5fdan 5d. Tentu saya bisa menulis byte x = 5, tapi itu agak tidak penting jika Anda gunakan varuntuk variabel lokal.

Matthias
sumber
20
Kebanyakan orang di sini tampaknya menganggap varadalah satu-satunya kasus penggunaan. Ada kasus penggunaan lain yang valid. Sebagai contoh byte value = condition ? (byte)5 : (byte)6,.
Hameer Abbasi
@HameerAbbasi untuk Anda, saya akan pergi var value = (byte)(condition ? 5 : 6);.
Shimmy Weitzhandler
Mungkin sedikit gila, tetapi Anda bisa melakukannya dengan byte value = condition ? ub5 : ub6;mendefinisikan byte ub5 = 5, ub6 = 6;. hehe
intrepidis
@HameerAbbasi Mengapa kamu tidak melakukannya byte value = condition ? 5 : 6;?
NetMage
@ NetMage Itu tidak berfungsi saat pertanyaan diposting.
Hameer Abbasi

Jawaban:

147

Tidak disebutkan akhiran literal pada referensi MSDN untuk Byte dan juga dalam Spesifikasi Bahasa C # 4.0 . Satu-satunya sufiks literal dalam C # adalah untuk bilangan bulat dan bilangan real sebagai berikut:

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

Jika Anda ingin menggunakan var, Anda selalu dapat menggunakan byte seperti divar y = (byte) 5

Meskipun tidak benar-benar terkait, dalam C # 7, awalan biner baru diperkenalkan 0b, yang menyatakan angka tersebut dalam format biner. Namun tidak ada akhiran untuk membuatnya byte, contoh:

var b = 0b1010_1011_1100_1101_1110_1111; //int
Mat
sumber
22
0b1010_1011_1100_1101_1110_1111masih merupakan Int32olah.
BanksySan
1
Bisakah Anda memberikan tautan ke dokumen C # 7 0byang dicakup.
user3613932
29

Jadi, kami menambahkan literal biner dalam VB musim gugur yang lalu dan mendapat umpan balik yang serupa dari penguji awal. Kami memang memutuskan untuk menambahkan akhiran byte untuk VB. Kami menetapkan SB (untuk byte yang ditandatangani) dan UB (untuk byte yang tidak ditandatangani). Alasannya bukan hanya B dan SB dua kali lipat.

Pertama, akhiran B bersifat mendua jika Anda menulis dalam heksadesimal (apa arti 0xFFB?) Dan bahkan jika kami memiliki solusi untuk itu, atau karakter lain selain 'B' ('Y' dianggap, F # menggunakan ini) tidak kita bisa mengingat apakah defaultnya sudah ditandatangani atau tidak - .NET byte tidak ditandai secara default sehingga masuk akal untuk memilih B dan SB tetapi semua sufiks lainnya ditandatangani secara default sehingga akan konsisten dengan sufiks tipe lain untuk memilih B dan UB. Pada akhirnya kami memilih SB dan UB yang jelas. - Anthony D. Green,

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

Rupanya, tampaknya mereka telah melakukan langkah ini di VB.NET (mungkin tidak akan dirilis sekarang), dan mereka mungkin menerapkannya di roslyn untuk C # - pergi berikan suara Anda, jika Anda pikir itu sesuatu yang Anda inginkan. Anda juga memiliki kesempatan untuk mengusulkan sintaks yang mungkin.

Erti-Chris Eelmaa
sumber
1
Akhiran masih tidak terdaftar di halaman MSDN (diperbarui 20 Juli 2015).
mbomb007
4
Dan sepertinya masih belum diimplementasikan pada VS 2017.
The Photon
2
Maupun di VS 2019. Sesuai halaman MSDN yang dikutip di atas (diperbarui 01/30/2018): Tidak ada karakter tipe pengidentifikasi untuk Boolean, Byte, Char, Tanggal, Objek, SBit, Pendek, UInteger, ULong, atau UShort tipe data , atau untuk tipe data komposit apa pun seperti array atau struktur.
Pona
10

Dari halaman MSDN ini , tampaknya satu-satunya pilihan Anda adalah menggunakan secara eksplisit ( var x = (byte)5), atau berhenti menggunakan var...

Dan Puzey
sumber
9
Bukan hanya tentang var. Misalnya,this.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen
@ JohnGietzen, tepatnya! Dalam kasus saya ini Math.Max(myByte, (byte)1). Dan BTW, Anda dapat mengganti contoh Anda menjadi this.pixels[x, y] = (byte)(condition ? 0 : 1);this.pixels[x, y] = Convert.ToByte(!condition);
:,
Bagaimana kalau menggunakan atribut? misalnya xunit: [InlineData(1)]- [InlineData(1b)]akan terlihat jauh lebih baik daripada [InlineData((byte)1)](hanya menggunakan 1bisa melempar pengecualian jika parameternya nullable byte dan Anda memberikannya int)
Matthias Burger
3

Per MSDN Anda dapat mendeklarasikan byte menggunakan desimal, heksadesimal atau biner literal.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;
Adrian Toman
sumber
7
Ya, tetapi byte x; x = predicate ? 0x05 : 0x00;merupakan kesalahan karena hasil dari operator ternary adalah int.
The Photon
1
@ThePhoton Hak Anda! Satu-satunya hal yang bisa saya katakan adalah: WAT! destroyallsoftware.com/talks/wat
Adrian Toman
3
Ini tidak menjawab pertanyaan. Pertanyaannya bukan tentang bagaimana saya bisa menginisialisasi byte tetapi tentang bagaimana saya bisa secara eksplisit mengatakan "ini byte". dengan var x = 5, x adalah int, dengan var x = 5d, x adalah dobel. Ketika menggunakan angka sebagai parameter dalam atribut, ini menjadi penting: konstruktor dengan ganda dapat melakukan hal lain selain konstruktor dengan int. (Mungkin seharusnya tidak, tetapi bisa). Dengan jawaban Anda, Anda hanya menunjukkan berbagai kemungkinan untuk menginisialisasi itu x.
Matthias Burger
@ThePhoton VB.net mari Anda lakukan itu. Dim x As Byte x = If (predikat, & H05, & H00)
Brain2000