SonarQube报C#递归方法需添加终止条件的问题如何修复
报错原因
该报错的触发原因是你写的SetProperty方法在内部没有任何终止条件的情况下直接调用了自身,形成了无限递归,运行时必然会出现栈溢出崩溃。
这个方法通常是MVVM架构里用来实现属性变更通知的通用封装,你当前的写法属于逻辑缺失的错误实现/重载。
修复方案
根据你的项目场景二选一即可:
场景一:当前类继承了MVVM框架的基类(比如CommunityToolkit.Mvvm的ObservableObject、Prism的BindableBase等)
你只需要在调用时加base关键字明确指定调用基类的实现,避免调用到当前自己写的这个重载方法即可:
private bool SetProperty<T>(T storageField, T value, [CallerMemberName] string pName = "") { return base.SetProperty<T>(storageField, value, pName); }
如果基类的方法签名和你当前写的完全一致,且这个重载没有额外自定义逻辑,也可以直接删掉整个方法,直接调用基类提供的SetProperty即可。
场景二:你需要自己实现完整的SetProperty逻辑
补全完整的判等、赋值、发通知逻辑即可,不要调用自身:
// 注意第一个参数要加ref关键字,否则值类型的字段无法完成赋值 private bool SetProperty<T>(ref T storageField, T value, [CallerMemberName] string pName = "") { // 新旧值一致时无需变更,直接返回 if (EqualityComparer<T>.Default.Equals(storageField, value)) return false; // 赋值后触发属性变更通知 storageField = value; OnPropertyChanged(pName); return true; }
注:上面代码中的OnPropertyChanged需要替换为你项目中实现INotifyPropertyChanged接口的对应通知方法。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

