Hậu tố nghĩa đen cho byte trong .NET?


162

Tôi tự hỏi nếu có bất kỳ cách nào để khai báo một biến byte theo cách ngắn như float hay double? Ý tôi là thích 5f5d. Chắc chắn tôi có thể viết byte x = 5, nhưng điều đó hơi không quan trọng nếu bạn sử dụng varcho các biến cục bộ.


20
Hầu hết mọi người ở đây dường như cho rằng varlà trường hợp sử dụng duy nhất. Có những trường hợp sử dụng hợp lệ khác. Ví dụ , byte value = condition ? (byte)5 : (byte)6.
Hameer Abbasi

@HameerAbasi trong trường hợp của bạn tôi sẽ đi var value = (byte)(condition ? 5 : 6);.
Shimmy Weitzhandler

Một chút bonkers có lẽ, nhưng bạn có thể đi với byte value = condition ? ub5 : ub6;bằng cách xác định byte ub5 = 5, ub6 = 6;. hehe
intrepidis

@HameerAbbasi Tại sao bạn không làm byte value = condition ? 5 : 6;?
NetMage

@NetMage Điều đó không hoạt động tại thời điểm câu hỏi được đăng.
Hameer Abbasi

Câu trả lời:


147

Không có đề cập đến một hậu tố bằng chữ trên tham chiếu MSDN cho Byte cũng như trong Đặc tả ngôn ngữ C # 4.0 . Các hậu tố bằng chữ duy nhất trong C # là cho các số nguyên và số thực như sau:

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

Nếu bạn muốn sử dụng var, bạn luôn có thể truyền byte như trongvar y = (byte) 5

Mặc dù không thực sự liên quan, nhưng trong C # 7, một tiền tố nhị phân mới đã được giới thiệu 0b, trong đó nêu rõ số này ở định dạng nhị phân. Vẫn không có hậu tố để làm cho nó một byte, ví dụ:

var b = 0b1010_1011_1100_1101_1110_1111; //int

21
0b1010_1011_1100_1101_1110_1111vẫn là một Int32mặc dù.
BanksySan

1
Bạn có thể cung cấp một liên kết đến tài liệu C # 7 0bđược bảo hiểm.
dùng3613932

29

Vì vậy, chúng tôi đã thêm các chữ nhị phân trong VB vào mùa thu năm ngoái và nhận được phản hồi tương tự từ những người thử nghiệm đầu tiên. Chúng tôi đã quyết định thêm một hậu tố cho byte cho VB. Chúng tôi giải quyết trên SB (cho byte đã ký) và UB (cho byte không dấu). Lý do không chỉ B và SB là hai lần.

Một, hậu tố B không rõ ràng nếu bạn viết theo hệ thập lục phân (0xFFB có nghĩa là gì?) Và ngay cả khi chúng tôi có giải pháp cho điều đó, hoặc một ký tự khác ngoài 'B' ('Y' đã được xem xét, F # sử dụng điều này) người ta có thể nhớ mặc định đã được ký hay chưa ký - Các byte .NET không được ký theo mặc định, vì vậy sẽ rất hợp lý khi chọn B và SB nhưng tất cả các hậu tố khác được ký theo mặc định để nó phù hợp với các hậu tố loại khác để chọn B và UB. Cuối cùng, chúng tôi đã tìm kiếm SB và UB rõ ràng. - Anthony D. Green,

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

Rõ ràng, có vẻ như họ đã thực hiện động thái này trong VB.NET (có thể không được phát hành ngay bây giờ) và họ có thể triển khai nó trong roslyn cho C # - hãy bỏ phiếu cho bạn, nếu bạn nghĩ đó là điều bạn thích. Bạn cũng có cơ hội đề xuất một cú pháp có thể.


1
Hậu tố vẫn chưa được liệt kê trên trang MSDN (cập nhật ngày 20 tháng 7 năm 2015).
mbomb007

4
Và dường như vẫn chưa được triển khai trong VS 2017.
Photon

2
Cũng không có trong VS 2019. Theo trang MSDN được trích dẫn ở trên (cập nhật ngày 30 tháng 1 năm 2018): Không có ký tự loại định danh nào tồn tại cho các loại dữ liệu Boolean, Byte, Char, Date, Object, SByte, Short, UInteger, ULong hoặc UShort hoặc cho bất kỳ loại dữ liệu tổng hợp nào như mảng hoặc cấu trúc.
Pona

10

Từ trang MSDN này, có vẻ như các tùy chọn duy nhất của bạn là truyền rõ ràng ( var x = (byte)5) hoặc ngừng sử dụng var...


9
Nó không chỉ là về var. Ví dụ:this.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen

@JohnGietzen, chính xác! Trong trường hợp của tôi, nó là Math.Max(myByte, (byte)1). Và BTW, bạn có thể thay thế ví dụ của mình thành : this.pixels[x, y] = (byte)(condition ? 0 : 1);, với tôi trông đẹp hơn một chút, hoặcthis.pixels[x, y] = Convert.ToByte(!condition);
Shimmy Weitzhandler

Làm thế nào về việc sử dụng trong các thuộc tính? ví dụ: xunit: [InlineData(1)]- [InlineData(1b)]sẽ trông tốt hơn [InlineData((byte)1)](chỉ sử dụng có 1thể ném ngoại lệ nếu tham số là byte không thể và bạn cung cấp cho nó một int)
Matthias Burger

3

Theo MSDN, bạn có thể khai báo một byte bằng cách sử dụng một chữ thập phân, thập lục phân hoặc nhị phân.

// decimal literal
byte x = 5;

// hex decimal literal
byte x = 0xC5;

// binary literal
byte x = 0b0000_0101;

7
Có, nhưng byte x; x = predicate ? 0x05 : 0x00;là một lỗi vì kết quả của toán tử ternary là một int.
Photon

1
@ThePhoton Quyền của bạn! Điều duy nhất tôi có thể nói với điều đó là: NƯỚC! phá hủyoftware.com/talks/wat
Adrian Toman

3
Điều này không trả lời câu hỏi. Câu hỏi không phải là về cách tôi có thể khởi tạo một byte mà là về cách tôi có thể nói rõ ràng "đó là một byte". với var x = 5, x là một int, với var x = 5d, x là gấp đôi. Khi sử dụng số làm tham số trong một thuộc tính, điều này trở nên quan trọng: một hàm tạo có hai lần có thể làm một cái gì đó khác với một hàm tạo với int. (Nó có thể không nên, nhưng nó có thể). Với câu trả lời của bạn, bạn chỉ hiển thị các khả năng khác nhau để khởi tạo điều đó x.
Matthias Burger

@ThePhoton VB.net hãy để bạn làm điều đó. Dim x As Byte x = If (vị ngữ, & H05, & H00)
Brain2000
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.