特性(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 ...
随机推荐
- 第九周PSP&进度条
PSP 一.表格: D日期 C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 11月11号 讨论 讨论beta发布 09:00 09:54 1 ...
- Mysql存储引擎federated
Mysql数据库存储引擎federated(联盟) 意思就是把两个不同区域的数据库联系起来,以致可以访问在远程数据库的表中的数据,而不是本地的表.->专门针对远程数据库的实现->一般情况下 ...
- 学习官方示例 - TForm.BorderIcons
本例用一行代码禁用了最大化按钮. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphi ...
- SVN Update Error: Please execute the 'Cleanup' command
尝试用下面两种方法 svn clean up 中有一个选项break lock勾选上 把对应的文件来里的.svn里面的lock文件删除. svn local delete, incoming dele ...
- LOJ#6118 鬼牌
\(\rm upd\):是我假了...这题没有爆精...大家要记得这道题是相对误差\(10^{-6}\)...感谢@foreverlasting的指正. 题是好题,可是标算爆精是怎么回事...要写的和 ...
- 【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛
题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...
- Lisp之根源 --- 保罗格雷厄姆
Lisp之根源 --- 保罗格雷厄姆 来源 http://daiyuwen.freeshell.org/gb/rol/roots_of_lisp.html 约翰麦卡锡于1960年发表了一篇非凡的论文, ...
- 【刷题】LOJ 6006 「网络流 24 题」试题库
题目描述 假设一个试题库中有 \(n\) 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 \(m\) 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组 ...
- [LOJ6436][PKUSC2018]神仙的游戏
loj description 给你一个只有01和?的字符串,问你是否存在一种把?改成01的方案使串存在一个长度为\(1-n\)的\(border\).\(n\le5\times10^5\) sol ...
- SpringBoot整合Swagger-ui
SpringBoot整合Swagger-ui 引入依赖 <dependency> <groupId>org.springframework.boot</groupId&g ...
说明