特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。 特性与程序实体关联后,即可在运行时使用名为“反射”的技术查询特性。 有关更多信息,请参见 反射(C# 和 Visual Basic)。

特性具有以下属性:

  • 特性可向程序中添加元数据。 元数据是有关在程序中定义的类型的信息。 所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的类型和类型成员。 可以添加自定义特性,以指定所需的任何附加信息。 有关更多信息,请参见 创建自定义特性(C# 和 Visual Basic)。

  • 可以将一个或多个特性应用到整个程序集、模块或较小的程序元素(如类和属性)。

  • 特性可以与方法和属性相同的方式接受参数。

  • 程序可以使用反射检查自己的元数据或其他程序内的元数据。 有关更多信息,请参见 使用反射访问特性(C# 和 Visual Basic)。

使用特性


特性可以放置在几乎所有的声明中(但特定的特性可能限制在其上有效的声明类型)。 在 C# 中,特性的指定方法为:将括在方括号中的特性名置于其应用到的实体的声明上方。 在 Visual Basic 中,特性括在尖括号 (< >) 内。 它必须位于所应用于的元素的紧前面并与该元素在同一行。

在本例中,使用特性 SerializableAttribute 将特定特征应用于类:

C#
VB

复制
[System.Serializable]
public class SampleClass
{// Objects of this type can be serialized.
}

具有 DllImportAttribute 特性的方法的声明如下:

C#
VB

复制
using System.Runtime.InteropServices;...[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();

一个声明上可放置多个特性:

C#
VB

复制
using System.Runtime.InteropServices;...void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }

某些特性对于给定实体可以指定多次。 例如,ConditionalAttribute 就是一个可多次使用的特性:

C#
VB

复制
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{// ...
}

说明

根据约定,所有特性名称都以单词“Attribute”结束,以便将它们与“.NET Framework”中的其他项区分。 但是,在代码中使用特性时,不需要指定 attribute 后缀。 例如,[DllImport] 虽等效于 [DllImportAttribute],但 DllImportAttribute 才是该特性在 .NET Framework 中的实际名称。

特性参数

许多特性都有参数,而这些参数可以是定位参数、未命名参数或命名参数。 任何定位参数都必须按特定顺序指定并且不能省略,而命名参数是可选的且可以按任意顺序指定。 首先指定定位参数。 例如,这三个特性是等效的:

C#
VB

复制
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]

第一个参数(DLL 名称)是定位参数并且总是第一个出现,其他参数为命名参数。 在这种情况下,两个命名参数均默认为 false,因此可将其省略。 有关默认参数值的信息,请参考各个特性的文档。

特性目标

特性的目标是应用该特性的实体。 例如,特性可以应用于类、特定方法或整个程序集。 默认情况下,特性应用于它后面的元素。 但是,您也可以显式标识要将特性应用于方法还是它的参数或返回值。

若要显式标识特性目标,请使用下面的语法:

C#
VB

复制
[target : attribute-list]

下表显示了可能的 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#
VB

复制
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]

下面的示例演示如何在 C# 中将特性应用于方法、方法参数和方法返回值。

C#
复制
// default: applies to method
[SomeAttr]
int Method1() { return 0; }// applies to method
[method: SomeAttr]
int Method2() { return 0; }// applies to return value
[return: SomeAttr]
int Method3() { return 0; }

说明

无论规定 SomeAttr 应用于什么目标,都必须指定 return 目标,即使 SomeAttr 被定义为仅应用于返回值也是如此。 换言之,编译器将不使用 AttributeUsage 信息解析不明确的特性目标。 有关更多信息,请参见 AttributeUsage(C# 和 Visual Basic)。

特性的常见用途


以下列表包含特性的几个常见用途:

  • 在 Web 服务中,使用 WebMethod 特性来标记方法,以指示该方法应该可通过 SOAP 协议进行调用。 有关更多信息,请参见 WebMethodAttribute。

  • 描述当与本机代码进行交互操作时如何封送方法参数。 有关更多信息,请参见 MarshalAsAttribute。

  • 描述类、方法和接口的 COM 属性。

  • 使用 DllImportAttribute 类调用非托管代码。

  • 在标题、版本、说明或商标方面描述您的程序集。

  • 描述要持久性序列化类的哪些成员。

  • 描述如何映射类成员和 XML 节点以便进行 XML 序列化。

  • 描述方法的安全要求。

  • 指定用于强制安全性的特性。

  • 由实时 (JIT) 编译器控制优化,以便易于调试代码。

  • 获取有关调用方的信息的方法。

相关章节


有关更多信息,请参见:

  • 创建自定义特性(C# 和 Visual Basic)

  • 使用反射访问特性(C# 和 Visual Basic)

  • 如何:使用特性创建 C/C++ 联合(C# 和 Visual Basic)

  • 常用特性(C# 和 Visual Basic)

  • 调用方信息(C# 和 Visual Basic)

请参见


参考

反射(C# 和 Visual Basic)

概念

C# 编程指南

其他资源

Visual Basic 编程指南
利用特性扩展元数据
引用:http://msdn.microsoft.com/zh-cn/library/z0w1kczw.aspx

转载于:https://www.cnblogs.com/wangluochong/p/3733887.html

特性(C# 和 Visual Basic)相关推荐

  1. Visual Basic了解

    Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...

  2. Visual Basic 15语言新特性

    对于C#的两个重要特性元组和Ref返回值,Visual Basic 15提供了对等的实现.这两个特性都是"不完全的",但已经可以提供足够的变通方案,让VB应用程序可以消费使用了这些 ...

  3. 友元程序集(C# 和 Visual Basic)

    友元程序集(C# 和 Visual Basic) Visual Studio 2013 "友元程序集"是一种能够访问其他程序集的 Friend (Visual Basic) 或 i ...

  4. Visual Basic 9.0 前沿播报·静态篇(一)局部变量类型推测和数组初始化器

    不要惊讶,每个PDC上都会有微软最新产品的前瞻,所以在Visual Basic 2005发布以前看到Visual Basic 9.0的消息就是可以理解的了.Visual Basic 9.0 (code ...

  5. Visual Basic 永远29岁,Visual Basic 谢幕!

    Visual Basic 永远29岁,微软宣布不再发展这门语言 近期,微软 NET 团队在开发者博客中宣布,他们虽然还会继续在 .NET 5.0 上支持 Visual Basic ,但不再将 VB 作 ...

  6. 关于Visual Basic 10.0

    随着VS2010早期CTP的放出,大家对下一代开发系统的期待热情又一次掀起了.除了已经开始被大家尝鲜的C#4以外,Visual Basic也进化成了10.0.不过据我观察,VB10的改变还没有C#4那 ...

  7. Visual Basic 兴衰记

    这是一篇暴露年龄的文章.为什么这么说?因为现在年轻的程序员可能没有接触过当年红极一时的 Visual Basic.28 年前的 1991 年 4 月,Microsoft 发布了 Visual Basi ...

  8. Visual Basic的未来之路

    上周,微软宣布了他们改变Visual Basic语言未来发展计划的想法.这次公布给Visual Basic开发人员留下了很多不确定性,但Visual Basic语言的设计者Anthony D.Gree ...

  9. 09年3月编程语言排行榜:Visual Basic与PHP的暗战

    TIOBE近日公布了最新一期的编程语言排行榜,除Java.C.C++依旧强势占领前三甲的位置外,前十名的其他语言均有小幅波动.本期榜单中,VB在坚守了两个月第四名的位置后,本期下降一位,与上期排名第五 ...

最新文章

  1. Thorntail 2.2.0提供从WildFly Swarm自动迁移的特性
  2. 苏宁零售云 App 稳定保障实践
  3. 摆动排序leetcode324
  4. 【JS基础】类型转换——不同数据类型比较
  5. vue3绑定多个事件
  6. Java 解析XML的几种方法
  7. 硬件安全 (1) —— SHA-1算法在FPGA上的实现
  8. 因“突发肾结石” 孙宇晨宣布取消与巴菲特的午餐会面
  9. Repeater 中如何绑定计算列的值
  10. jsp java 登陆界面代码_jsp登陆界面源代码
  11. 服务器session文件什么时候销毁,node中session存储与销毁,及session的生命周期
  12. 用python输出杨辉三角形,python输出杨辉三角
  13. 前端POST请求下载文件
  14. 关于哪些信息是个人隐私信息
  15. 20221024 matlab快速画图中图
  16. 世界杯快结束了,VAR的故事才刚刚开始
  17. ThinkPHP模版引擎之变量输出具体解释
  18. 【转】这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已
  19. 往服务器抛数以及从服务器读数(AL11的具体用法)
  20. 2023北京师范大学理论物理专业考研必看详细经验指导

热门文章

  1. smarty---设置
  2. 数据工厂 mysql_.net中利用数据工厂实现多数据库的操作
  3. python json模块有什么用_Python中json模块与jsonpath模块的区别是什么
  4. 水泵怎么做_不是说鱼缸里放置三合一水泵都会起到反作用,也得看什么缸什么鱼...
  5. vivado----fpga硬件调试 (三)----mark_debug
  6. 强化学习之贝尔曼方程中文解释
  7. 神经网络模拟逻辑推理-演绎推理
  8. 我的mongo学习之路
  9. HDU - 2041 - 超级楼梯(dp)
  10. Fastq-dump:我的日常命令