C# 特性和索引(C#学习笔记06)(乘风破浪的姐姐第三季)

网友投稿 456 2022-06-21


特性

特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。

特性可以当成一个特殊的类看待

列举特性语法:

[attribute(positional_parameters, name_parameter = value, ...)]

element

attribute为特性名称,positional_parameters, name_parameter是特性属性,value为name_parameter属性的值

三种预定义特性:

.Net Framework 提供了三种预定义的特性:

1. AttributeUsage

该特性描述了用户定义的特性类如何被使用

AttributeUsage基本结构:

[AttributeUsage( validon,

AllowMultiple=allowmultiple,

Inherited=inherited )]

示例:

validon规定了该特性能够被承载,或者说是能够被那些类型所使用的声明,如示例中指明了该特性只能在Class(类),constructor(结构体),Field(字段),Method(方法),Property(属性)

AllowMutiple规定是否能被重复使用,如果为true则能被重复使用

Inherited规定这个特性是否能被派生类继承,默认false不可继承,true则为可继承

2.Conditional

这个预定义特性标记了一个条件方法,其执行依赖于特定的预处理标识符

它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值

Conditional的基本结构:

[

Conditional(

conditionalSymbol

)]

使用示例:

该程序预定义了一个宏:hong,Conditional特性在函数Message中被使用:[Conditional("hong")] 如果没有该宏定义则不会执行函数Message

1. 若定义了宏则程序如上,运行:(Message会被调用)

In Main function.

In Function 1.

In Function 2.

C:\C#\code\Conditional\bin\Debug\netcoreapp3.0\Conditional.exe (进程 18092)已退出,返回代码为: 0。

若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。

按任意键关闭此窗口...

2. 若将第一行定义宏注释:

//#define hong

using System;

using System.Diagnostics;

运行(此时Message函数不会被调用,则没有输出):

C:\C#\code\Conditional\bin\Debug\netcoreapp3.0\Conditional.exe (进程 18264)已退出,返回代码为: 0。

若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。

按任意键关闭此窗口...

3.Obsolete

这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。

Obsolete特性结构:

[Obsolete(

message )]

[Obsolete(

message,

iserror )]

message:为描述文字,不使用该函数的原因以及替换函数

iserror:为bool值,true则编译器会把引用了该特性的项目当成错误,产生编译器警告

示例:

运行编译器会提示错误:

Don't use OldMethod, use NewMethod instead

创建自定义特性的步骤:

声明自定义特性

构建自定义特性

在目标程序元素上应用自定义特性

通过反射访问特性

详细示例在学习完反射后一同进行

反射

反射(Reflection) 对象用于在运行时获取类型信息。该类位于 System.Reflection 命名空间中,可访问一个正在运行的程序的元数据。

System.Reflection 命名空间包含了允许您获取有关应用程序信息及向应用程序动态添加类型、值和对象的类。

反射(Reflection)有下列用途:

它允许在运行时查看属性(attribute)信息。

它允许审查集合中的各种类型,以及实例化这些类型。

它允许延迟绑定的方法和属性(property)。

它允许在运行时创建新类型,然后使用这些类型执行一些任务。

查看元数据

System.Reflection.MemberInfo info = typeof(MyClass);          

System.Reflection.MemberInfo需要初始化,用于与目标类关联(MyClass)

结果:(返回了MyClass类所承载的两个特性)

HelpAttribute

OtherAttribute

C:\C#\code\Feflection\bin\Debug\netcoreapp3.0\Feflection.exe (进程 6244)已退出,返回代码为: 0。

若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。

按任意键关闭此窗口...

利用特性设置声明信息并用反射进行访问

结果:

参考链接:

https://w3cschool.cn/wkcsharp/8jib1nvi.html

https://w3cschool.cn/wkcsharp/9phg1nvl.html


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C#报Lc.exe已退出 代码为-1 错误解决方法(cctv5在线直播观看)
下一篇:两数相加(C#数据结构和算法练习)(两数相加乘以两数相减公式)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~