如何编写可在赋值前按需修改值的set属性?
如何编写可在赋值前按需修改值的set属性?
嗨,我完全懂你的需求——就是想给这个字符串属性加个能自动清理前缀的setter对吧?你之前的写法踩了两个小坑:一是自动属性(那种get; set;的简写形式)没办法直接在set里自定义赋值逻辑,二是不小心用到了还在预览阶段的field关键字,才触发了CS8652那个错误。
咱换个简单稳妥的写法,用显式私有字段+手动实现get/set就搞定了,完全用正式支持的C#语法,不会有预览特性的问题。直接看代码:
// 先声明一个私有字段,用来存储属性的实际值 private string _strIOMask; public string strIOMask { get { // get逻辑直接返回私有字段的值 return _strIOMask; } set { // 先对传入的value做预处理 string processedValue = value; // 先判断value不为空,避免空引用异常,再检查是否有0x前缀(不区分大小写) if (!string.IsNullOrEmpty(processedValue) && processedValue.ToLower().StartsWith("0x")) { // 去掉开头的0x部分 processedValue = processedValue.Substring(2); } // 把处理后的值赋值给私有字段 _strIOMask = processedValue; } }
给你拆解下这段代码的关键点:
- 新增的
_strIOMask是私有字段,专门存这个属性的实际值,外部不能直接访问 - get方法很简单,直接返回这个私有字段的内容就行
- set方法里先把传入的
value存到临时变量,做前缀检查和清理,最后把处理好的值赋值给私有字段 - 加了
!string.IsNullOrEmpty(processedValue)的判断,是为了防止传入null的时候调用ToLower()触发空引用异常,让代码更健壮
测试下效果:
- 如果你给
strIOMask赋值"0x000f",最终存储的就是"000f" - 要是传入
"0X1234"(大写的0X),也会被处理成"1234" - 普通的字符串比如
"abcd"就会直接原样存储,不会做任何修改
你之前尝试的那种混合自动属性和自定义set逻辑的写法之所以不行,是因为自动属性的get; set;是语法糖,背后虽然会生成私有字段,但你不能直接在set里修改value就完事,必须把处理后的值明确赋值给存储用的字段,而用field关键字访问那个自动生成的字段还处于预览阶段,官方还不支持,所以咱用显式私有字段的写法是最稳妥的。
内容来源于stack exchange
相关产品推荐
相关产品推荐

