加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – FxCop讨厌我对MVVM的使用

发布时间:2020-12-16 01:35:10 所属栏目:百科 来源:网络整理
导读:我刚刚开始使用FxCop来查看我的代码对其完整规则的影响有多么糟糕.我开始使用“Breaking”规则,我遇到的第一个是CA2227,它基本上说你应该只读取一个collection属性的setter,这样你就不会意外地改变收集数据. 由于我使用MVVM,我发现使用带有get / set属性的Ob
我刚刚开始使用FxCop来查看我的代码对其完整规则的影响有多么糟糕.我开始使用“Breaking”规则,我遇到的第一个是CA2227,它基本上说你应该只读取一个collection属性的setter,这样你就不会意外地改变收集数据.

由于我使用MVVM,我发现使用带有get / set属性的ObservableCollection非常方便,因为它使我的GUI更新在代码隐藏中变得简单和简洁.但是,我也可以看到FxCop在抱怨什么.

我遇到的另一种情况是使用WF,我需要在创建工作流时设置参数,我不得不围绕我正在使用的集合编写一个包装类,以避免出现这种特殊的错误消息.

例如,这是我在readonly创建属性时获得的示例运行时错误消息:

The activity 'MyWorkflow' has no public writable property named 'MyCollectionOfStuff'

你对此有何看法?我可以忽略这个特定的错误,但这可能不好,因为我可以想象在MVVM不适用的代码中的其他地方违反了这个规则(例如,仅建模代码).我想我也可以通过操作底层集合的方法将它从属性更改为类,然后从setter方法引发必要的通知.我有点困惑……任何人都可以对此有所了解吗?

解决方法

此特定规则告诉我们,应该将集合属性设置为只读,因为您不需要将整个集合分配给属性.

例如,想象一个这样的类:

public class Foo
{
   public ObservableCollection<int> Bar { get; set; }
}

如果代码中的某处我有以下行会发生什么:

var f = new Foo();
f.Bar = new ObservableCollection<int>();
f.Bar.AddRange(new int[] { 1,2,3,4 });
// ...
// Attaches and handlers to the collection events
// ...
f.Bar = new ObservableCollection<int>();
f.Bar.AddRange(new int[] { 5,6,7,8 });

当执行最后两行代码时,不会触发附加的事件处理程序,因为Bar属性具有完全不同的对象.

另一方面,如果属性是只读的,则会触发事件,一切都会按预期运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读