特性(C# 和 Visual Basic)
特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。 特性与程序实体关联后,即可在运行时使用名为“反射”的技术查询特性。 有关更多信息,请参见 反射(C# 和 Visual Basic)。
特性具有以下属性:
特性可向程序中添加元数据。 元数据是有关在程序中定义的类型的信息。 所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的类型和类型成员。 可以添加自定义特性,以指定所需的任何附加信息。 有关更多信息,请参见 创建自定义特性(C# 和 Visual Basic)。
可以将一个或多个特性应用到整个程序集、模块或较小的程序元素(如类和属性)。
特性可以与方法和属性相同的方式接受参数。
程序可以使用反射检查自己的元数据或其他程序内的元数据。 有关更多信息,请参见 使用反射访问特性(C# 和 Visual Basic)。
特性可以放置在几乎所有的声明中(但特定的特性可能限制在其上有效的声明类型)。 在 C# 中,特性的指定方法为:将括在方括号中的特性名置于其应用到的实体的声明上方。 在 Visual Basic 中,特性括在尖括号 (< >) 内。 它必须位于所应用于的元素的紧前面并与该元素在同一行。
在本例中,使用特性 SerializableAttribute 将特定特征应用于类:
具有 DllImportAttribute 特性的方法的声明如下:
一个声明上可放置多个特性:
某些特性对于给定实体可以指定多次。 例如,ConditionalAttribute 就是一个可多次使用的特性:
  说明 | 
|---|
| 
 根据约定,所有特性名称都以单词“Attribute”结束,以便将它们与“.NET Framework”中的其他项区分。 但是,在代码中使用特性时,不需要指定 attribute 后缀。 例如,[DllImport] 虽等效于 [DllImportAttribute],但 DllImportAttribute 才是该特性在 .NET Framework 中的实际名称。  | 
特性参数
许多特性都有参数,而这些参数可以是定位参数、未命名参数或命名参数。 任何定位参数都必须按特定顺序指定并且不能省略,而命名参数是可选的且可以按任意顺序指定。 首先指定定位参数。 例如,这三个特性是等效的:
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
第一个参数(DLL 名称)是定位参数并且总是第一个出现,其他参数为命名参数。 在这种情况下,两个命名参数均默认为 false,因此可将其省略。 有关默认参数值的信息,请参考各个特性的文档。
特性目标
特性的目标是应用该特性的实体。 例如,特性可以应用于类、特定方法或整个程序集。 默认情况下,特性应用于它后面的元素。 但是,您也可以显式标识要将特性应用于方法还是它的参数或返回值。
若要显式标识特性目标,请使用下面的语法:
下表显示了可能的 target 值的列表。
| 
 C#  | 
 Visual Basic  | 
 适用对象  | 
|---|---|---|
| 
 assembly  | 
 Assembly  | 
 整个程序集  | 
| 
 module  | 
 Module  | 
 当前程序集模块(不同于 Visual Basic 模块)  | 
| 
 field  | 
 不支持  | 
 在类或结构中的字段  | 
| 
 event  | 
 不支持  | 
 event  | 
| 
 method  | 
 不支持  | 
 方法或 get 和 set 属性访问器  | 
| 
 param  | 
 不支持  | 
 方法参数或 set 属性访问器参数  | 
| 
 property  | 
 不支持  | 
 属性  | 
| 
 return  | 
 不支持  | 
 方法、属性索引器或 get 属性访问器的返回值  | 
| 
 type  | 
 不支持  | 
 结构、类、接口、枚举或委托  | 
下面的示例演示如何将特性应用于程序集和模块。 有关更多信息,请参见 常用特性(C# 和 Visual Basic)。
下面的示例演示如何在 C# 中将特性应用于方法、方法参数和方法返回值。
 说明 | 
|---|
| 
 无论规定 SomeAttr 应用于什么目标,都必须指定 return 目标,即使 SomeAttr 被定义为仅应用于返回值也是如此。 换言之,编译器将不使用 AttributeUsage 信息解析不明确的特性目标。 有关更多信息,请参见 AttributeUsage(C# 和 Visual Basic)。  | 
以下列表包含特性的几个常见用途:
在 Web 服务中,使用 WebMethod 特性来标记方法,以指示该方法应该可通过 SOAP 协议进行调用。 有关更多信息,请参见 WebMethodAttribute。
描述当与本机代码进行交互操作时如何封送方法参数。 有关更多信息,请参见 MarshalAsAttribute。
描述类、方法和接口的 COM 属性。
使用 DllImportAttribute 类调用非托管代码。
在标题、版本、说明或商标方面描述您的程序集。
描述要持久性序列化类的哪些成员。
描述如何映射类成员和 XML 节点以便进行 XML 序列化。
描述方法的安全要求。
指定用于强制安全性的特性。
由实时 (JIT) 编译器控制优化,以便易于调试代码。
获取有关调用方的信息的方法。
特性(C# 和 Visual Basic)的更多相关文章
- Visual Basic了解
		
Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...
 - 演练:Office 编程(C# 和 Visual Basic)
		
https://msdn.microsoft.com/zh-cn/library/ee342218(v=vs.110).aspx PIA的全称是 primary interop assembly 主 ...
 - [引]MSDN  Visual Basic 和 C# 中都会用到的编程概念
		
本文转自:http://msdn.microsoft.com/zh-cn/library/dd460655.aspx 本节介绍 Visual Basic 和 C# 中都会用到的编程概念. 本节内容 ...
 - 如何:使用 Visual Basic 编写基于 Unity3D 的计算器
		
随着 .NET 全平台战略的推进,微软正在让以 C# 为先锋的 .NET 拥有跨平台特性.这个过程中一直有人想知道其它 .NET 语言对跨平台的支持有什么改进,熟悉 C# 但是喜欢用 VB 的我也不例 ...
 - C#与Visual Basic的异与同
		
C#是一种高级程序设计语言,是一种安全.稳定.简单.优雅的编程语言,它与Visual Basic有很多相同的地方,同时也有很多不同的地方.我们今天这篇博客本着学习C#的原则,着重介绍一下C#与Visu ...
 - Visual Basic 函数速查
		
Calendar 常数 可在代码中的任何地方用下列常数代替实际值: 常数 值 描述 vbCalGreg 0 指出使用的是阳历. vbCalHijri 1 指出使用的是伊斯兰历法. Color 常数 可 ...
 - 如何:创建签名的友元程序集(C# 和 Visual Basic)
		
如何:创建签名的友元程序集(C# 和 Visual Basic) Visual Studio 2013 本示例演示了如何将友元程序集和具有强名称的程序集一起使用. 这两种程序集必须都使用强名称. ...
 - 友元程序集(C# 和 Visual Basic)
		
友元程序集(C# 和 Visual Basic) Visual Studio 2013 “友元程序集”是一种能够访问其他程序集的 Friend (Visual Basic) 或 internal (C ...
 - 杂项-软件: VBA(Visual Basic for Applications)
		
ylbtech-杂项-软件: VBA(Visual Basic for Applications) VBA (Visual Basic宏语言) Visual Basic for Application ...
 
随机推荐
- 使用Arduino驱动基于ST7533芯片的TFT屏
			
在合宙通信买了一个1.8寸的TFT屏,驱动芯片是ST7533,本来打算使用Air800直接驱动,但由于其他原因,放弃了.于是尝试使用arduino驱动,为了屏幕刷新速度更快,采用硬件SPI. 硬件连接 ...
 - 如何用Qt自动拷贝exe依赖的dll
			
QT生成的.exe文件不能运行的解决办法 之前的数独项目的GUI,当我的Qt项目生成exe时,由于缺少了相关的依赖dll文件,打开会一直报缺少依赖文件的错: 然后一开始我到安装的Qt文件夹里把这些有Q ...
 - final版本发布评价II
			
其实我对技术上的问题了解不多,所以有些评语可能说的不对或者压根就没啥用.可直接忽略.请见谅. 1新蜂的俄罗斯方块,UI设计虽然给出了背景和颜色,但是感觉色彩对比也不好,模块之间也不协调.没有更多的说服 ...
 - Linux命令(二十二) 改变文件权限 chomd
			
目录 1.命令简介 2.常用参数介绍 3.实例 4.直达底部 命令简介 chmod 命令是用来改变文件权限或目录的命令,可以将指定文件的拥有着改为指定的用户或组,用户可以是用户名或用户ID,组可以是组 ...
 - Windows 2019 下安装Oracle18c
			
1. 跟之前版本不一样 与linux 的版本一样 18c的DB 端的安装有区别. 首先需要 创建一个oracle的目录. 这里最简单的方法是 参照12c的目录来 创建 比如我创建的 然后将 db_ho ...
 - 查看Jira 使用的H2数据库 数据结构以及内容的方法
			
1. 同事在研究jira 想看看jira的数据库 数据结构, 告知使用的是java的H2数据库. 如图示 2. 然后根据此内容 进行百度等. 下载 可以进行数据库连接的工具,主要找到两个,下载地址分别 ...
 - Spring之c3p0连接池xml配置和使用举例
			
1.导入jar包 c3p0-0.9.5.2.jar mchange-commons-java-0.2.11.jar 2.源码: beans.xml <beans xmlns="http ...
 - 深入理解ajax系列第八篇——表单提交
			
前面的话 在以前,网站的用户与后端交互的主要方式是通过HTML表单的使用.表单的引入在1993年,由于其简单性和易用性,直到电子商务出现之前一直保持着重要位置.理解表单提交,对于更深入地理解ajax是 ...
 - CUDA ---- 线程配置
			
前言 线程的组织形式对程序的性能影响是至关重要的,本篇博文主要以下面一种情况来介绍线程组织形式: 2D grid 2D block 线程索引 矩阵在memory中是row-major线性存储的: 在k ...
 - 【刷题】LOJ 6005 「网络流 24 题」最长递增子序列
			
题目描述 给定正整数序列 \(x_1 \sim x_n\) ,以下递增子序列均为非严格递增. 计算其最长递增子序列的长度 \(s\) . 计算从给定的序列中最多可取出多少个长度为 \(s\) 的递增子 ...
 
			
		
 说明