ตัวต่อท้ายที่แท้จริงของไบต์ใน. NET?


162

ฉันสงสัยว่ามีวิธีใดที่จะประกาศตัวแปร byte ในทางสั้น ๆ เช่นลอยหรือคู่? ผมหมายถึงชอบและ5f 5dแน่นอนว่าฉันสามารถเขียนbyte x = 5ได้ แต่มันค่อนข้างไม่สำคัญหากคุณใช้varกับตัวแปรในตัวเครื่อง


20
คนส่วนใหญ่ที่นี่ดูเหมือนจะถือว่าvarเป็นกรณีใช้งานเท่านั้น มีกรณีการใช้งานที่ถูกต้องอื่น ๆ ตัวอย่างเช่นbyte value = condition ? (byte)5 : (byte)6.
Hameer Abbasi

@HameerAbbasi var value = (byte)(condition ? 5 : 6);ในกรณีของคุณผมไป
Shimmy Weitzhandler

บางทีเป็นคนทำบาปนิดหน่อย แต่คุณสามารถbyte value = condition ? ub5 : ub6;กำหนดbyte ub5 = 5, ub6 = 6;ได้ด้วย hehe
intrepidis

@HameerAbbasi ทำไมคุณไม่ทำbyte value = condition ? 5 : 6;ล่ะ
NetMage

@NetMage ไม่สามารถใช้ได้ในขณะที่มีการโพสต์คำถาม
Hameer Abbasi

คำตอบ:


147

มีการกล่าวถึงปัจจัยที่แท้จริงในไม่มีการอ้างอิง MSDN สำหรับ Byteเช่นเดียวกับใน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ครอบคลุมได้ไหม
user3613932

29

ดังนั้นเราจึงเพิ่มตัวอักษรไบนารีใน VB เมื่อฤดูใบไม้ร่วงที่ผ่านมาและได้รับข้อเสนอแนะที่คล้ายกันจากผู้ทดสอบก่อน เราตัดสินใจที่จะเพิ่มคำต่อท้ายสำหรับไบต์สำหรับ VB เราตัดสินใน SB (สำหรับไบต์ที่ลงนาม) และ UB (สำหรับไบต์ที่ไม่ได้ลงชื่อ) เหตุผลที่ไม่ใช่แค่ B และ SB คือสองเท่า

หนึ่งส่วนต่อท้าย B นั้นคลุมเครือถ้าคุณเขียนเป็นเลขฐานสิบหก (0xFFB หมายถึงอะไร) และแม้ว่าเรามีวิธีแก้ปัญหาสำหรับเรื่องนั้นหรือตัวละครอื่นที่ไม่ใช่ 'B' ('Y' ถูกพิจารณาแล้ว F # ใช้สิ่งนี้) ไม่ หนึ่งสามารถจำได้ว่าค่าเริ่มต้นได้รับการลงนามหรือไม่ได้ลงนาม -. ไบต์ NET จะไม่ได้ลงนามโดยค่าเริ่มต้นดังนั้นมันจะทำให้รู้สึกถึงการเลือก B และ SB แต่ส่วนต่อท้ายอื่น ๆ ที่มีการลงนามโดยค่าเริ่มต้นดังนั้นมันจะสอดคล้องกับ UB ในที่สุดเราก็ไปหา SB และ UB ที่ไม่คลุมเครือ - Anthony D. Green,

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

เห็นได้ชัดว่าดูเหมือนว่าพวกเขาได้ทำสิ่งนี้ใน VB.NET (อาจไม่ได้รับการปล่อยตัวในตอนนี้) และพวกเขาอาจนำไปใช้ใน Roslyn สำหรับ C # - ให้โหวตของคุณถ้าคุณคิดว่าเป็นสิ่งที่คุณต้องการ นอกจากนี้คุณยังมีโอกาสเสนอไวยากรณ์ที่เป็นไปได้


1
คำต่อท้ายนี้ยังไม่ปรากฏในหน้า MSDN (อัปเดต 20 กรกฎาคม 2558)
mbomb007

4
และดูเหมือนจะยังไม่ถูกนำมาใช้ใน VS 2017
The Photon

2
หรือใน VS 2019 ตามหน้า MSDN ที่อ้างถึงข้างต้น (อัพเดท 01/30/2018): ไม่มีตัวอักษรประเภทตัวระบุสำหรับ Boolean, Byte, Char, วันที่, วัตถุ, SByte, สั้น, UInteger, ULong หรือ UShort หรือสำหรับชนิดข้อมูลคอมโพสิตใด ๆ เช่นอาร์เรย์หรือโครงสร้าง
Pona

10

จากนี้หน้า MSDN ก็จะดูเหมือนว่าตัวเลือกของคุณเท่านั้นที่จะหล่ออย่างชัดเจน ( var x = (byte)5) หรือหยุดการใช้var...


9
varมันไม่ได้เป็นเพียงเกี่ยวกับ ตัวอย่างเช่นthis.pixels[x, y] = condition ? (byte)0 : (byte)1;
John Gietzen

@ 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
โฟตอน

1
@ThePhoton สิทธิ์ของคุณ! สิ่งเดียวที่ฉันสามารถพูดได้นั่นคือ: วัด! destroyallsoftware.com/talks/wat
Adrian Toman

3
นี่ไม่ได้ตอบคำถาม คำถามไม่เกี่ยวกับฉันจะเริ่มต้นไบต์ได้อย่างไร แต่ฉันจะพูดได้อย่างไรว่า "เป็นไบต์" อย่างชัดเจน กับvar x = 5, x เป็น int, กับvar x = 5d, x เป็นสองเท่า เมื่อใช้หมายเลขเป็นพารามิเตอร์ในแอททริบิวสิ่งนี้กลายเป็นสิ่งสำคัญ: คอนสตรัคเตอร์ที่มี double สามารถทำอย่างอื่นได้มากกว่าคอนสตรัคเตอร์ที่มี int (อาจไม่ควร แต่ทำได้) ด้วยคำตอบของคุณคุณจะแสดงความเป็นไปได้ต่าง ๆ ในการเริ่มต้นxเท่านั้น
Matthias Burger

@ThePhoton VB.net ให้คุณทำอย่างนั้น Dim x ในฐานะ Byte x = If (เพรดิเคต, & H05, & H00)
Brain2000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.