跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 属性验证
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#属性验证 = == 介绍 == '''属性验证'''是C#中确保对象状态合法性的重要机制,通过验证逻辑限制属性值的有效范围。当属性被赋值时,系统会执行预定义的检查规则,若值不符合要求则抛出异常或采取其他处理方式。这种技术广泛应用于数据完整性保护、用户输入验证和业务规则强制执行等场景。 C#提供多种实现属性验证的方式: * 字段封装与setter验证 * 特性注解(Data Annotations) * INotifyDataErrorInfo接口 * IDataErrorInfo接口 * 自定义验证框架集成 == 基础验证模式 == === 字段封装验证 === 最基础的验证方式是在属性setter中编写条件逻辑: <syntaxhighlight lang="csharp"> public class Product { private decimal _price; public decimal Price { get => _price; set { if (value < 0) throw new ArgumentOutOfRangeException("价格不能为负数"); _price = value; } } } </syntaxhighlight> '''示例输出:''' <pre> Product p = new Product(); p.Price = -10; // 抛出ArgumentOutOfRangeException </pre> === 特性注解验证 === System.ComponentModel.DataAnnotations命名空间提供验证特性: <syntaxhighlight lang="csharp"> using System.ComponentModel.DataAnnotations; public class User { [Required(ErrorMessage = "用户名必填")] [StringLength(50, MinimumLength = 3)] public string Username { get; set; } [Range(18, 120, ErrorMessage = "年龄必须在18-120之间")] public int Age { get; set; } } </syntaxhighlight> == 高级验证技术 == === 自定义验证特性 === 创建继承自ValidationAttribute的类实现复杂规则: <syntaxhighlight lang="csharp"> public class EvenNumberAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext context) { if (value is int number && number % 2 == 0) return ValidationResult.Success; return new ValidationResult("必须输入偶数"); } } public class InventoryItem { [EvenNumber] public int ShelfQuantity { get; set; } } </syntaxhighlight> === 跨属性验证 === 通过类级别特性实现多属性关联验证: <syntaxhighlight lang="csharp"> [AttributeUsage(AttributeTargets.Class)] public class DateRangeValidAttribute : ValidationAttribute { public override bool IsValid(object value) { var model = value as Event; return model.StartDate < model.EndDate; } } [DateRangeValid(ErrorMessage = "结束日期必须晚于开始日期")] public class Event { public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } } </syntaxhighlight> == 验证流程模型 == <mermaid> graph TD A[属性赋值] --> B{是否满足验证规则?} B -->|是| C[更新字段值] B -->|否| D[触发验证错误] D --> E[抛出异常/收集错误] </mermaid> == 实际应用案例 == === 电商系统价格验证 === <syntaxhighlight lang="csharp"> public class Product { private decimal _originalPrice; private decimal _discountedPrice; public decimal OriginalPrice { get => _originalPrice; set => _originalPrice = value >= 0 ? value : throw new ArgumentException("原价不能为负"); } public decimal DiscountedPrice { get => _discountedPrice; set { if (value < 0) throw new ArgumentException("折扣价不能为负"); if (value > OriginalPrice) throw new ArgumentException("折扣价不能高于原价"); _discountedPrice = value; } } } </syntaxhighlight> === 用户注册表单验证 === 结合WPF/MVVM模式的典型实现: <syntaxhighlight lang="csharp"> public class RegistrationViewModel : INotifyPropertyChanged, INotifyDataErrorInfo { private string _email; private readonly Dictionary<string, List<string>> _errors = new(); [Required] [EmailAddress] public string Email { get => _email; set { _email = value; ValidateEmail(); OnPropertyChanged(); } } private void ValidateEmail() { ClearErrors(nameof(Email)); if (string.IsNullOrWhiteSpace(Email)) AddError(nameof(Email), "邮箱地址不能为空"); else if (!new EmailAddressAttribute().IsValid(Email)) AddError(nameof(Email), "邮箱格式无效"); } // INotifyDataErrorInfo实现... } </syntaxhighlight> == 数学公式验证示例 == 对于需要数学验证的场景(如几何图形类): <math> \text{面积} = \begin{cases} \text{合法} & \text{当 } x > 0 \text{ 且 } y > 0 \\ \text{非法} & \text{其他情况} \end{cases} </math> 对应代码实现: <syntaxhighlight lang="csharp"> public class Rectangle { private double _width; private double _height; public double Width { get => _width; set => _width = value > 0 ? value : throw new ArgumentException("宽度必须大于0"); } public double Height { get => _height; set => _height = value > 0 ? value : throw new ArgumentException("高度必须大于0"); } public double Area => Width * Height; } </syntaxhighlight> == 最佳实践 == 1. '''尽早验证''':在数据进入系统时立即验证 2. '''明确错误信息''':提供可操作的错误提示 3. '''分层验证''': * 前端:即时反馈 * 后端:最终防线 4. '''避免重复验证''':合理设计验证层级 5. '''性能考虑''':复杂验证延迟到必要时执行 == 常见问题 == '''Q:属性验证与构造函数验证有何区别?''' A:构造函数验证确保对象创建时的初始状态合法,属性验证则维护对象整个生命周期的状态合法性。两者通常需要配合使用。 '''Q:何时该抛出异常而不是返回验证结果?''' A:对于程序逻辑错误(如null引用)应抛出异常;对于预期的业务规则违反(如用户输入无效)通常返回验证结果更合适。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 属性与事件]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)