.NET中字节的文字后缀?
Posted
技术标签:
【中文标题】.NET中字节的文字后缀?【英文标题】:Literal suffix for byte in .NET? 【发布时间】:2011-07-19 16:19:51 【问题描述】:我想知道是否有任何方法可以像浮点数或双精度数一样以短的方式声明字节变量?我的意思是像5f
和5d
。当然我可以写byte x = 5
,但如果你使用var
来表示局部变量,那就有点无关紧要了。
【问题讨论】:
这里的大多数人似乎认为var
是唯一的用例。还有其他有效的用例。例如,byte value = condition ? (byte)5 : (byte)6
。
【参考方案1】:
MSDN reference for Byte 和 C# 4.0 Language Specification 中没有提及文字后缀。 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
【讨论】:
0b1010_1011_1100_1101_1110_1111
仍然是 Int32
。
您能否提供一个指向包含0b
的C# 7 文档的链接。
另一个用例是数据驱动测试和DataRowAttribute
,如果测试失败,它需要转换为字节以避免以下情况:。“也不能从源类型扩大到目标类型,因为源类型不是原始类型或无法完成转换。”
这工作:[DataRow((byte)207, (byte)2)]
这也不行:[DataRow(207, 2)]
【参考方案2】:
从this MSDN 页面看来,您唯一的选择似乎是显式转换 (var x = (byte)5
),或者停止使用 var
...
【讨论】:
不仅仅是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);
使用in属性怎么样?例如xunit: [InlineData(1)]
- [InlineData(1b)]
看起来比 [InlineData((byte)1)]
好得多(如果参数是可空字节并且你给它一个 int,则仅使用 1
可能会引发异常)【参考方案3】:
所以,我们去年秋天在 VB 中添加了二进制文字并得到了类似的反馈 来自早期测试人员。我们确实决定为 VB 添加一个字节后缀。我们 选择 SB(用于有符号字节)和 UB(用于无符号字节)。原因 不只是 B 和 SB 是双重的。
第一,如果你用十六进制写,B 后缀是不明确的(什么 0xFFB 是什么意思?),即使我们有解决方案,或者其他 字符比'B'('Y'被考虑,F#使用这个)没人能 记住默认值是有符号还是无符号 - .NET 字节是 默认情况下未签名,因此选择 B 和 SB 是有意义的,但所有 其他后缀是默认签名的,所以它是一致的 使用其他类型后缀来选择 B 和 UB。最后我们去了 明确的 SB 和 UB。 -- 安东尼 D. 格林,
https://roslyn.codeplex.com/discussions/542111
显然,他们似乎已经在 VB.NET 中完成了这一举措(现在可能不会发布),他们可能会在 roslyn 中为 C# 实现它——如果你认为这是你想要的,那就去投票吧喜欢。您还有机会提出一种可能的语法。
【讨论】:
MSDN page 上仍未列出后缀(2015 年 7 月 20 日更新)。 而且在 VS 2017 中似乎仍然没有实现。 在 VS 2019 中也没有。根据上面引用的 MSDN 页面(2018 年 1 月 30 日更新):布尔、字节、字符、日期、对象、SByte 不存在标识符类型字符、Short、UInteger、ULong 或 UShort 数据类型,或用于数组或结构等任何复合数据类型。 @PonaUL
后缀适用于 ulong
(UInt64
)。【参考方案4】:
根据MSDN,您可以使用十进制、十六进制或二进制文字声明一个字节。
// decimal literal
byte x = 5;
// hex decimal literal
byte x = 0xC5;
// binary literal
byte x = 0b0000_0101;
【讨论】:
是的,但是byte x; x = predicate ? 0x05 : 0x00;
是一个错误,因为三元运算符的结果是一个int。
@ThePhoton 你的权利!我唯一能说的就是:WAT! destroyallsoftware.com/talks/wat
这没有回答问题。问题不是关于我如何初始化一个字节,而是关于我如何明确地说“它是一个字节”。对于var x = 5
,x 是一个整数,对于var x = 5d
,x 是一个双精度数。当在属性中使用数字作为参数时,这一点变得很重要:具有 double 的构造函数可以做其他事情,而不是具有 int 的构造函数。 (它可能不应该,但它可以)。通过您的回答,您只展示了初始化 x
的不同可能性。
@ThePhoton VB.net 让你这样做。 Dim x As Byte x = If(predicate, &H05, &H00)以上是关于.NET中字节的文字后缀?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中编写 3 个字节的 unicode 文字?