[FxCop.设计规则]13. 定义自定义属性参数的访问属性

13.     定义自定义属性参数的访问属性

翻译概述:

一个比较无聊的规则,实在看不出在什么情况下,一个开发者会做出违反这条规则的设计。没有别的内容,只是说应该为自定义特性的构造函数中的参数提供一个相关的属性去读取它们的值。

一个让我比较费解的规则,即没有看出其中所传达的设计思想,也没发现任何优秀的设计技巧。

原文引用:

Define accessors for attribute arguments<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

TypeName:

DefineAccessorsForAttributeArguments

CheckId:

CA1019

Category:

Microsoft.Design

Message Level:

Error

Certainty:

95%

Breaking Change:

NonBreaking


Cause: In its constructor, an attribute defines arguments that do not have corresponding properties.

Rule Description

Attributes can define mandatory arguments that must be specified when applying the attribute to a target. These are sometimes called positional arguments because they are supplied to attribute constructors as positional parameters. For every mandatory argument, the attribute should also provide a corresponding read-only property so that the value of the argument can be retrieved at execution time. This rule checks to see that for each constructor parameter, you have defined the corresponding property.

Attributes can also define optional arguments, called named arguments. These arguments are supplied to attribute constructors by name and should have a corresponding read/write property.

For mandatory and optional arguments, the corresponding properties and constructor parameters should use the same name but different casing. (Properties use Pascal casing, and parameters use camel casing.)

How to Fix Violations

To fix a violation of this rule, add a read-only property for each constructor parameter that does not have one.

When to Exclude Messages

Exclude a message from this rule if you do not want the value of the mandatory argument to be retrievable.

Example Code

The following example shows two attributes that define a mandatory (positional) parameter. The first implementation of the attribute is incorrectly defined. The second implementation is correct.

[Visual Basic]

None.gifImports System
None.gif
ExpandedBlockStart.gifContractedBlock.gif
Namespace DesignLibraryNamespace DesignLibrary
InBlock.gif
InBlock.gif
' Violates rule: DefineAccessorsForAttributeArguments.
InBlock.gif
<AttributeUsage(AttributeTargets.All)>  _
ExpandedSubBlockStart.gifContractedSubBlock.gif
NotInheritable Public Class BadCustomAttributeClass BadCustomAttribute
InBlock.gif    
Inherits Attribute
InBlock.gif    
Private data As String
InBlock.gif    
InBlock.gif    
' Missing the property that corresponds to 
InBlock.gif
    ' the someStringData parameter.
ExpandedSubBlockStart.gifContractedSubBlock.gif
    Public Sub New()Sub New(someStringData As String)
InBlock.gif        data 
= someStringData
ExpandedSubBlockEnd.gif    
End Sub
 'New
ExpandedSubBlockEnd.gif
End Class
 'BadCustomAttribute
InBlock.gif

InBlock.gif
InBlock.gif
InBlock.gif
' Satisfies rule: Attributes should have accessors for all arguments.
InBlock.gif
<AttributeUsage(AttributeTargets.All)>  _
ExpandedSubBlockStart.gifContractedSubBlock.gif
NotInheritable Public Class GoodCustomAttributeClass GoodCustomAttribute
InBlock.gif    
Inherits Attribute
InBlock.gif    
Private data As String
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Sub New()Sub New(someStringData As String)
InBlock.gif        data 
= someStringData
ExpandedSubBlockEnd.gif    
End Sub
 'New
InBlock.gif

InBlock.gif    
'The constructor parameter and property
InBlock.gif
    'name are the same except for case.
InBlock.gif
    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public ReadOnly Property SomeStringData()Property SomeStringData() As String
InBlock.gif        
Get
InBlock.gif            
Return data
InBlock.gif        
End Get
ExpandedSubBlockEnd.gif    
End Property

ExpandedSubBlockEnd.gif
End Class
 
InBlock.gif
ExpandedBlockEnd.gif
End Namespace

None.gif


[C#]

None.gifusing System;
None.gif
None.gif
namespace DesignLibrary
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
// Violates rule: DefineAccessorsForAttributeArguments.
InBlock.gif

InBlock.gif   [AttributeUsage(AttributeTargets.All)]
InBlock.gif   
public sealed class BadCustomAttribute :Attribute 
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif      
string data;
InBlock.gif
InBlock.gif      
// Missing the property that corresponds to 
InBlock.gif      
// the someStringData parameter.
InBlock.gif

InBlock.gif      
public BadCustomAttribute(string someStringData)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif         data 
= someStringData;
ExpandedSubBlockEnd.gif      }

ExpandedSubBlockEnd.gif   }

InBlock.gif
InBlock.gif
// Satisfies rule: Attributes should have accessors for all arguments.
InBlock.gif

InBlock.gif   [AttributeUsage(AttributeTargets.All)]
InBlock.gif   
public sealed class GoodCustomAttribute :Attribute 
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif      
string data;
InBlock.gif
InBlock.gif      
public GoodCustomAttribute(string someStringData)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif         data 
= someStringData;
ExpandedSubBlockEnd.gif      }

InBlock.gif      
//The constructor parameter and property
InBlock.gif      
//name are the same except for case.
InBlock.gif

InBlock.gif      
public string SomeStringData
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif         
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif            
return data;
ExpandedSubBlockEnd.gif         }

ExpandedSubBlockEnd.gif      }

ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}


Related Rules

Avoid unsealed attributes

See Also

Attribute Usage Guidelines

引起的原因:

没有为一个自定义特性(Attribute)的构造函数中的所有参数定义相应的属性来访问这些参数。

描述:

自定义特性可以定义一组强制参数,当将特性应用到目标上时,必须指定这些参数。因为他们被定义为特性的构造函数的位置参数(非命名参数),通常称它们为位置参数。对于每一个强制参数,自定义特性应该同时提供一个相关的制度属性,这样,才能在需要的时候获得这些参数的值。这条规则检查你是否为每一个参数定义了相关属性。

自定义特性也可以定义可选参数,称之为命名参数。在自定义特性的构造函数中可以使用名字指定它们的值。应该为它们定义可读可写属性。

对于强制的和可选的参数,他们相关的属性应该和构造函数参数有类似的名字,仅仅使用大小写区分它们。(属性使用Pascal命名规则,参数使用骆峰命名规则)

修复:

为构造函数中的每一个参数提供一个只读属性。

例外:

如果你不打算获得强制参数的值,可以忽略这条规则。

例程:

原文中给出了两个自定义特性类(分别给出了使用VB.NETC#的实现),它们都定义了一个强制参数。其中第一个自定义特性类违反了这条规则,没有为强制参数实现相关的属性。第二个自定义特性类修复了这个问题。

转载于:https://www.cnblogs.com/Cajon/archive/2005/06/28/182305.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7安装Cloudera Manager

第一部分&#xff1a;准备工作一&#xff0c;修改hostname $vim /etc/sysconfig/network $source /etc/sysconfig/network例如&#xff1a; NETWORKINGyes HOSTNAMEspark01reboot重启服务器 二&#xff0c;关闭selinux查看SELinux状态1&#xff0c;/usr/sbin/sestatus -v #如果…

Grove——.NET中的ORM实现

Grove——.NET中的ORM实现 发布日期&#xff1a; 6/30/2005| 更新日期&#xff1a; 6/30/2005作者&#xff1a;林学鹏 ORM的全称是Object Relational Mapping&#xff0c;即对象关系映射。它的实质就是将关系数据&#xff08;库&#xff09;中的业务数据用对象的形式表示出来&a…

[book]道法自然

前不久读了王咏刚的〈凌波微步〉和〈凌波微步II〉&#xff0c;感觉不错。今天把他老人家的《道法自然》也买了下来。在dearbook看到关于这本书的长篇大评&#xff0c;也一块copy了下来&#xff1a;http://www.dearbook.com.cn/book/viewbook.aspx?pnoTS0023954认真的作者&…

列表嵌套字典,根据字典某一key排序

在返回列表嵌套字典时候&#xff0c;往往需要对数据进行一定的处理&#xff1a;按照字典中某一个key排序 In [87]: a [{"name": "牛郎", "age": 23},{"name":"许仙", "age": 20},{"name":"董永&q…

写出C语言中5种数据类型的名称及其关键字,求C语言中的32个关键字及其意思?...

关键字如下&#xff1a;一、数据类型关键字(12个)&#xff1a;(1) char &#xff1a;声明字符型变量或函数(2) double &#xff1a;声明双精度变量或函数(3) enum &#xff1a;声明枚举类型(4) float&#xff1a;声明浮点型变量或函数(5) int&#xff1a; 声明整型变量或函数(6…

想要设计自己的微服务?看这篇文章就对了

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由我就静静地看 发表于云社区专栏 本文通过使用Spring Boot&#xff0c;Spring Cloud和Docker构建的概念验证应用程序的示例&#xff0c;为了解常见的微服务架构模式提供了一个起点。 该代码在Github上…

mysql 开发进阶篇系列 41 mysql日志之慢查询日志

一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒&#xff09;&#xff0c;获得表锁定的时间不算作执行时间。慢日志默认写入到参数datadir(数据目录)指定的路径下。默认文件名是[hostname]_slow.log&#xff0c;默认超时是10秒&#xff0c;默认不开…

分数相同名次排名规则C语言,如何给数据排名(相同分数相同名次)-excel篇

使用Rank函数来做数据排名该函数是返回一个数值在一个数字列表中的排名。语法&#xff1a;RANK(number,ref,order)RANK(对象,范围,参数)number(必填参数):是特定单位格中的数据&#xff0c;需要在整个数字列表中排名的单个对象。ref(必填参数):是指需要排名的整体数列。即范围&…

MySql的连接查询

若一个查询同时涉及到两个或者两个以上的表&#xff0c;则称之为连接查询。常见的包括&#xff1a;等值连接查询&#xff0c;自然连接查询&#xff0c;非等值连接查询&#xff0c;自身连接查询&#xff0c;外连接查询&#xff08;左右连接&#xff09;。 1.等值与非等值连接查询…

qt运行C语言后无显示,qt designer启动后不显示界面问题的原因与解决办法-站长资讯中心...

Qt 5.6.1无论是在vs里双击ui文件还是直接启动designer.exe都一直无法显示界面&#xff0c;但任务管理器中可以看到该进程是存在的。前几天还正常的&#xff0c;但昨天加了一块NVIDIA的显卡(机器自带核显)&#xff0c;可能与此有关。幸好还可以通过QtCreator打开ui文件进行编辑。…

OpenSolaris北京用户组的第一次活动

OpenSolaris北京用户组的第一次活动作者: BadcoffeeEmail: blog.olivergmail.comBlog: http://blog.csdn.net/yayong2005年10月10月15号&#xff0c;OpenSolaris北京用户组在北京西郊宾馆会议厅组织了成立以来的第一次活动。尽管OpenSolaris早在2005年6月14日就正式开放源代码&…

Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

Android PermissionUtils&#xff1a;运行时权限工具类及申请权限的正确姿势 ifadai 关注 2017.06.16 16:22* 字数 318 阅读 3637评论 1喜欢 6PermissionUtil 经常写Android运行时权限申请代码&#xff0c;每次都是复制过来之后&#xff0c;改一下权限字符串就用&#xff0c;把…

Linux基础监控小工具nmon

nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具&#xff0c; nmon所记录的信息是比较全面的&#xff0c;它能在系统运行过程中实时地捕捉系统资源的使用情况&#xff0c;并且能输出结果到文件中。nmon工具可以帮助在一个屏幕上显示所有重要的性能优化信息&…

vue的配置环境篇

1.电脑已经安装的nodejs和webpack。 2.1&#xff09;打开cmd。winr。可以直接输入node -v查看版本。安装淘宝镜像 npm install -g cnpm --registryhttp://registry.npm.taobao.org &#xff0c;安装成功可以查看下&#xff0c;cnpm -v 3.安装vue脚手架&#xff0c;输入命令&am…

Agilent RF fundamentals (4)- Impedance match and distortions

1 Impedance match&#xff1a; 2 distortions&#xff1a; Solar radiation produces background noise 转载于:https://www.cnblogs.com/huangbaobaoi/p/9650937.html

android论坛功能开发教程,Android教程 如何免费生成论坛App

介绍按照快速集成文档&#xff0c;您可以很容易的把BBSSDK提供的功能集成到您的应用中&#xff0c;然后使用BBSSDK来做开发。在集成前&#xff0c;您也可以先下载示例Sample的源码工程(包含应用内打开pdfoffice等格式文件)。使用Android Studio打开后&#xff0c;编译出网站上提…

自动化测试===adb 解锁手机的思路

在adb里有模拟按键/输入的命令 比如使用 adb shell input keyevent <keycode> 命令&#xff0c;不同的 keycode 能实现不同的功能&#xff0c;完整的 keycode 列表详见 KeyEvent&#xff0c;摘引部分我觉得有意思的如下&#xff1a; keycode含义3HOME 键4返回键5打开拨号…

android 编译器有问题,Android Studio 3.0 Beta 2发布:解决编译器bug

5月18日&#xff0c;IT之家曾经报道&#xff0c;谷歌发布了Android Studio 3.0的测试版&#xff0c;新增了对Kotlin语言的支持&#xff0c;而日前&#xff0c;谷歌发布了Android Studio 3.0的Beta 2版本。此版本并无新功能加入&#xff0c;不过修复了一个困扰开发人员的bug&…

Kali安装magescan评估工具

Magento &#xff08;麦进斗&#xff09; 是一套专业开源的电子商务系统。Magento设计得非常灵活&#xff0c;具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。其面向企业级应用&#xff0c;可处理各方面的需求&#xff0c;以及建设一个多种用途和适用面的电子…

领域驱动设计在马蜂窝优惠中心重构中的实践

前言 正如领域驱动设计之父 Eric Evans 所著一书的书名所述&#xff0c;领域驱动设计&#xff08;Domain Driven Design&#xff09;是一种软件核心复杂性应对之道。 在我们解决现实业务问题时&#xff0c;会面对非常复杂的业务逻辑。即使是同一个事物&#xff0c;在多个子业务…