乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 177|回复: 12

如何验证结构的属性?

[复制链接]

71

主题

483

帖子

7

银币

中流砥柱

Rank: 25

铜币
765
发表于 2019-1-5 19:13:32 | 显示全部楼层 |阅读模式
嘿,各位,我有一个简单的问题,似乎找不到简单的答案。
有没有办法验证结构的属性值
示例:
类程序
{
无效测试()
{
TrueColor-MyColor
MyColor。红色=212
MyColor。绿色=152
MyColor。蓝色=314;//
}
}
结构TrueColor
{//这些属性是否可以在0-255范围内?
公共内部红色
公共int绿色
公共内部蓝色
}

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2019-1-5 19:48:04 | 显示全部楼层
最好的方法是创建一个“ColorValue”类
类似于

类颜色值{
私有int_ value
公共int值{
获取{
返回值
}
设置{
如果(值>255){
<div>//封顶并继续(或抛出异常?)
_ value=255
}
否则如果(值
_ value=0
}否则{
_ value=value
}
}
}
}
当您将原语类型用作程序中的“类型”,并且仅在计算方法中使用int、string等原语类型时(在小范围内,并且在整个应用程序中不公开),这样包装原语类型被认为是一种良好的做法
您可能还需要根据需要编写ToString()和其他接口方法等。
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2019-1-5 20:04:11 | 显示全部楼层
你能把属性定义为byte(无符号8位整数)吗?
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2019-1-5 20:13:44 | 显示全部楼层

说得好,这会截断两边的值还是在运行时抛出异常?例如,如果用户在提示符下输入更大的值?
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2019-1-5 20:20:44 | 显示全部楼层

另外,对于截断的强制转换检查
https://docs . Microsoft . com/en-us/dot net/API/system . byte . max value?view=netframework-4.7.2 :
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2019-1-5 20:36:20 | 显示全部楼层
我想这取决于上下文,对于像这样的颜色值,我只是在两端封顶,因为最终结果对最终颜色没有太大影响,并且避免了许多不必要的锅炉板来处理异常。任何大于255的值都不会使它变成红色
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2019-1-5 20:44:36 | 显示全部楼层
将int(其计算值恰好为330)转换为一个字节可能会产生意想不到的结果
ie会导致.Red值为74
添加:
我在一天结束时的姿势“一切取决于”
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2019-1-5 23:39:04 | 显示全部楼层
谢谢迈克!正在研究应该如何做..由于int 是不可为null的类型,因此如果我尝试将int 属性设置为null,编译器将引发错误。也许在这种情况下,返回一个负的int值会更合适,而不是在值超出范围时抛出异常?尽管最好的做法是“在运行时抛出异常”就像你在下一篇文章中提到的那样。顺便说一下,即使您的示例被定义为“结构”而不是“类”,它也能正常工作。感谢kdub,byte 在这种情况下完美地工作了-    struct true color 。
{ 。
公共字节红色;。
公共字节绿色;。
公共字节蓝色;。
}说得好,这样会截断两边的值还是在运行时引发异常?例如,如果用户在提示符下输入一个更大的值?如果有一个基于自定义标准的运行时验证就好了,就像回复#1中的例子一样。虽然即使有可能,编译器也只能在常量变量上验证它(因为该值是预定义的),而不能在用户输入(如Console)上验证。ReadLine();我的问题是从更仔细地探索“结构”开始的,在我使用带有属性和构造函数的类之前。但我意识到,与其定义5-6个构造函数来验证(全部或部分)属性,我可以只使用一个struct,所以我想起了John的问题问题是我不知道如何在属性内验证(没有构造函数)..为了给奶牛的体重设定一个范围。但是现在我知道了,多亏了Mike的回复!我试图从这里解决这个练习#12,其中验证进入下一个级别(每个雇员都有一个唯一的ID)所以我想这意味着将employee结构包装在employees类中,并通过ID验证遍历一个List?(顺便说一句,我不是在改变我的问题,而是在扩展它)。
回复

使用道具 举报

71

主题

483

帖子

7

银币

中流砥柱

Rank: 25

铜币
765
发表于 2019-1-6 12:11:50 | 显示全部楼层
在这种情况下,我认为没有理由使用struct,特别是考虑到不同数据类型和所需验证的数量。然后,您可以将雇员包装在一个“Employees”类中,该类保存雇员列表,并在添加新雇员时创建ID。也许是这样的?    class雇员{。
private _ name。
//等等...。
//需要无符号int,因为不能有负id号。
private uint _ id。

int ID {。
{ get设置;}。
}。
}。

雇员类{。
私人列表 _employees =新列表();。
//因为ID是唯一的,所以不需要重用它们,只需保留一个总数即可。
private uint _ idCount。

公共单位添加(员工e){。
//...这里是其他初始化内容。
e . ID = _ ID count++;。
}。
}。
我认为当您需要类似坐标或类似的东西,其中有一小组类似的数据时,结构是方便和轻量级的。如果你需要做坐标方面的工作,那么创建一个类会更容易,这样你就可以做矢量计算等等。你很少在野外看到结构。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2019-1-6 15:03:25 | 显示全部楼层
翻译错误代码(429):请求 QPS 超过限制。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 08:42 , Processed in 0.208563 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表