作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑这些方法,每个方法都从输入缓冲区中提取字节:
byte ReadByte(List<byte> data); //removes and returns 1 byte
UInt16 ReadUInt16(List<byte> data); //removes and returns 2 bytes as a short
UInt32 ReadUInt32(List<byte> data); //removes and returns 4 bytes as an int
现在我有一个像这样的结构/类:
class Thing
{
public byte a{get;set;}
public UInt16 b{get;set;}
public UInt32 c{get;set;}
public byte d{get;set;}
public void Read(List<byte> data)
{
a = ReadByte(data);
b = ReadUInt16(data);
c = ReadUInt16(data); //BUG this is a 32bit data
d = ReadByte(data);
}
}
因为 short
会自动提升为 int
,所以这段代码可以正常编译和运行,但引入了难以发现的错误 - 它已阅读比 c
应少 2 个字节,所有后续读取的值都将是错误的。
是否有任何技术可用于确保当 c
的类型为 UInt32
时,它不会接受 UInt16
或其他类型合法类型?
理想情况下 Thing
不会改变,但如果您的解决方案需要它,那也没关系。
最佳答案
最好的方法是编写单元测试来验证输入是否与预期输出相匹配。您还可以进行反射以自动执行逻辑或使用代码生成器执行操作。
除非您想编写 Roslyn 分析器,否则在构建时没有任何东西可以帮助您。
关于c# - 有什么方法可以防止/检测自动/隐式类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62881282/
我是一名优秀的程序员,十分优秀!