C# 类变量赋值前做自定义操作使用get set出现栈溢出如何解决
报错原因
你当前的写法会触发无限递归:DELIVERY_DATE是C#类属性,当你在get访问器中直接返回DELIVERY_DATE时,会再次触发该属性的get逻辑;在set访问器中给DELIVERY_DATE赋值时,也会再次触发该属性的set逻辑,整个调用没有终止条件,最终栈空间耗尽抛出栈溢出错误。
思路验证
你的实现方向完全正确,属性的get/set访问器本身就是为了封装字段读写的自定义逻辑设计的,非常适合做赋值校验、格式化、补位这类需求,只需要调整写法即可。
修正方案
你需要额外声明一个私有后台字段作为属性值的实际存储容器,访问器内部只操作这个后台字段,避免触发递归调用,示例代码如下:
// 私有后台字段,仅当前类内部可访问,用于实际存储值 private string _deliveryDate; public string DELIVERY_DATE { get { // 取值时直接返回后台字段的值,不会触发递归 return _deliveryDate; } set { // 赋值时做自定义处理后写入后台字段 _deliveryDate = checkDate(value, "yyyyMMdd"); } }
如果你需要在取值时也加自定义逻辑,也可以在get块里对_deliveryDate做处理后再返回。
补充说明:平时不需要自定义读写逻辑的属性可以直接用自动属性写法public string DELIVERY_DATE { get; set; },编译器会自动生成隐藏的后台字段,不需要手动声明;但只要需要自定义get或set的逻辑,就必须手动显式声明后台字段。
内容的提问来源于stack exchange,提问作者Lightsout
相关产品推荐
相关产品推荐

