[FxCop.设计规则]14. 不要在封闭类中定义保护型成员
2005-07-10 19:05 Colin Han 阅读(1869) 评论(0) 编辑 收藏 举报14. 不要在封闭类中定义保护型成员
翻译概述:
使用Sealed声明密封类可以提高程序的执行效率(详细内容可以看:sealed能提高性能),因此比较推荐将不再需要继承的类型声明为密封类型。
当一个类型被声明为密封类型后,在其中定义保护型成员就变得没有意义了。同时,这样做可能会增加将来的维护成本(见本文中的例外段)。
个人认为,密封类型并没有被编译器优化从而增加程序的效率(使用ILDASM检查并没有发现密封类和非密封类有什么不同),只是通过将类型声明为密封类型。可以给使用者传达一个明确的信息,使用者可以根据这些信息对代码进行一些优化,提高使用这个类型的效率。例如在FxCop的另外一条性能规则中,微软说他们对Attribute.GetCustomAttribute进行了一些优化,如果发现Attribute是一个封闭类型,会减少一些逻辑,从而提高效率。
引起的原因:
一个公共类型声明了一个保护型的成员。但是这个规则不检查析构函数,(Which must follow this pattern 不明白)
描述:
使用保护型成员是为了确保只有这个类型的继承类型可以访问或者重写这些成员。但是,按照定义,封闭类将不能被继承。因此声明的保护型成员将不会被调用。
C#编译器会识别这个问题并产生一个编译时警告。
修复:
将这些成员修改成私有成员,或者修改这个类型为可继承的类型(非封闭类型)
例外:
不要忽略这个问题。否则,将为增加维护的成本,并且不会带来任何好处。
例程:
原文中给出了两个类型,分别使用C#和VB实现,这两个类型都违背了这条规则。
译注:
正如在翻译概述中所说的,封闭类型会给使用者传达一个暗示,使用者会根据这些暗示对代码进行一些优化,因此将一个封闭类型修改为非封闭类型是一个比较危险的行为。同时,在密封类型中声明保护型成员也会使使用者难以理解设计者的意图(事实上,设计者可能自己也不知道自己的意图了。)
原文引用:
Do not declare protected members in sealed types
Rule Description Types declare protected members so that inheriting types can access or override the member. By definition, you cannot inherit from a sealed type, which means that protected methods on sealed types cannot be called. The C# compiler issues a warning for this error. How to Fix Violations To fix a violation of this rule, change the access level of the member to private or make the type inheritable. When to Exclude Messages Do not exclude a message from this rule. Leaving the type in its current state can cause maintenance issues and does not provide any benefits. Example Code The following example shows a type that violates this rule. [Visual Basic] ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() [C#] ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix