.NET中字节的文字后缀?


162

我想知道是否有任何方法可以像floats或doubles这样简短地声明字节变量?我的意思是5f5d。当然可以写byte x = 5,但是如果var用于局部变量,那有点无关紧要。


20
这里的大多数人似乎都认为这var是唯一的用例。还有其他有效的用例。例如,byte value = condition ? (byte)5 : (byte)6
Hameer Abbasi 2014年

@HameerAbbasi在你的情况下,我去var value = (byte)(condition ? 5 : 6);
Shimmy Weitzhandler,

也许有些傻瓜,但是您可以byte value = condition ? ub5 : ub6;通过定义来进行byte ub5 = 5, ub6 = 6;。呵呵
intrepidis

@HameerAbbasi您为什么不这样做byte value = condition ? 5 : 6;
NetMage

@NetMage在问题发布时不起作用。
Hameer Abbasi

Answers:


147

MSDN参考资料的ByteC#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'5

1
您可以提供指向C#7文档的链接吗0b
user3613932

29

因此,去年秋天,我们在VB中添加了二进制文字,并从早期测试人员那里得到了类似的反馈。我们确实决定为VB添加字节的后缀。我们选择了SB(用于有符号字节)和UB(用于无符号字节)。不仅仅是B和SB的原因有两个。

一个,如果您使用十六进制书写(0xFFB是什么意思?),并且即使我们有解决方案,或者不是'B'的另一个字符(认为是'Y',F#都使用此字符),B后缀也是不明确的人们可能会记得默认值是带符号的还是无符号的-.NET字节默认情况下是无符号的,因此选择B和SB是有意义的,但是所有其他后缀都默认情况下为有符号,因此与其他类型的后缀选择B和SB一致UB。最后,我们选择了明确的SB和UB。-安东尼·格林(Anthony D. Green),

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

显然,他们似乎已经在VB.NET中进行了此操作(可能现在尚未发布),并且他们可能会在roslyn中为C#实现它-如果您认为自己想要的话,请投票。您还将有机会提出可能的语法。


1
后缀仍未在MSDN页面上列出(2015年7月20日更新)。
mbomb007'1

4
而且似乎仍然没有在VS 2017中实现
Photon的

2
在VS 2019中也不是。根据上面引用的MSDN页面(更新于01/30/2018):布尔,字节,字符,日期,对象,字节,短数据,UInteger,ULong或UShort数据类型不存在标识符类型字符,或用于任何复合数据类型,例如数组或结构。
Pona,

10

MSDN页面上,您似乎唯一的选择是显式转换(var x = (byte)5)或停止使用var...


9
不只是关于var。例如,this.pixels[x, y] = condition ? (byte)0 : (byte)1;
约翰·吉岑

@JohnGietzen,完全是!以我为例Math.Max(myByte, (byte)1)。顺便说一句,您可以将示例替换为: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;是一个错误,因为三元运算符的结果是整数。
Photon

1
@ThePhoton你的权利!我唯一可以说的是:WAT!destroyallsoftware.com/talks/wat
Adrian Toman

3
这不能回答问题。问题不是关于如何初始化一个字节,而是关于我如何明确地说“这是一个字节”。其中var x = 5,x是整数,其中var x = 5d,x是双精度型。当将数字用作属性中的参数时,这变得很重要:具有double的构造函数可以执行其他操作,而不是具有int的构造函数。(它可能不应该,但是可以)。使用您的答案,您只显示出初始化它的不同可能性x
Matthias Burger

@ThePhoton VB.net让您做到这一点。Dim x作为字节x = If(谓词&H05,&H00)
Brain2000
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.