特性(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 ...
随机推荐
- TCP/IP之蓟辽督师 转
原创: 刘欣 码农翻身 2016-11-07 本文续<TCP/IP之大明内阁>, 不了解背景的同学可以先看看上一篇文章, 当然这篇也是<TCP/IP之大明邮差>的前传, 主要讲 ...
- JS 中的require 和 import 区别
这两个都是为了JS模块化编程使用. 遵循规范 require 是 AMD规范引入方式 import是es6的一个语法标准,如果要兼容浏览器的话必须转化成es5的语法 调用时间 require是运行时调 ...
- 如何让搜索引擎抓取AJAX内容?
越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容. 这种做法的好处 ...
- 从0在windows上一次性上传本地整个项目(包含所有文件/文件夹)到 Github
1.注册并登陆Github. 2.登陆进去之后的页面,点击这个“库”,这表示你在Github上上的代码仓库,我这里已经创建过一个了,所以数量是1 3.在仓库选项卡中,点击“新建”按钮添加一个项目. 4 ...
- 【BZOJ3832】[POI2014]Rally(拓扑排序,动态规划)
[BZOJ3832][POI2014]Rally(拓扑排序,动态规划) 题面 BZOJ,权限题 洛谷 题解 这题好强啊,感觉学了好多东西似的. 首先发现了一个图画的很好的博客,戳这里 然后我来补充一下 ...
- 【OpenCV】摄像机标定+畸变校正
摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过OpenCV进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.open ...
- 【BZOJ4444】国旗计划
Description 题目链接 Solution 磕了3个半小时没做出来的题,就是全场崩. 首先对于一个人的答案是很好求的,显然是选择左端点在此人区间中,右端点最远(最靠右)的人作为下一个接棒人.因 ...
- luogu1081 [NOIp2012]开车旅行 (STL::multiset+倍增)
先用不管什么方法求出来从每个点出发,A走到哪.B走到哪(我写了一个很沙雕的STL) 然后把每个点拆成两个点,分别表示A从这里出发和B从这里出发,然后连边是要A连到B.B连到A.边长就是这次走的路径长度 ...
- 大数据高性能数据库Redis在Windows上的使用教程
Redis学习笔记----Redis在windows上的安装配置和使用 Redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括s ...
- SP422 TRANSP2 - Transposing is Even More Fun——置换群+反演
挺神仙的置换题 SP422 TRANSP2 - Transposing is Even More Fun 这个博客除了开始举例子别的都是对的: https://blog.csdn.net/Braket ...
说明