学院评估+++网站建设整改个人简历网页模板下载

当前位置: 首页 > news >正文

学院评估+++网站建设整改,个人简历网页模板下载,社交电商小程序,网站开发美学 2.0序号系列文章10【C#基础】C# 正则表达式11【C#基础】C# 预处理器指令12【C#基础】C# 文件与IO文章目录前言1#xff0c;特性的概念1.1 特性的属性1.2 特性的用途2#xff0c;特性的定义2.1 特性参数2.2 特性目标3#xff0c;预定义特性3.1 AttributeUsage3.2 Conditional3.2…序号系列文章10【C#基础】C# 正则表达式11【C#基础】C# 预处理器指令12【C#基础】C# 文件与IO文章目录前言1特性的概念1.1 特性的属性1.2 特性的用途2特性的定义2.1 特性参数2.2 特性目标3预定义特性3.1 AttributeUsage3.2 Conditional3.2.1 条件特性类3.3 Obsolete4自定义特性4.1 声明自定义特性4.2 构建自定义特性4.3 应用自定义特性结语前言 大家好我是writer桑前面一章已经学习了 C# 中文件与IO的操作那本章就开始学习 C# 中特性的使用希望看完大家能够有所收获感谢支持 1特性的概念 特性 (Attribute) 是用于在运行时传递程序中各种元素比如类、方法、结构、组件等的行为信息的声明性标签。可以使用特性将元数据或声明性信息与代码相关联。一个特性的声明可以通过放置在它所作用的对象上面的方括号[]来描述。 1.1 特性的属性 在 C# 中特性的属性可以总结以下几点 特性向程序添加元数据。元数据就是“描述数据的数据”在程序中表现为描述类型的相关信息如编译器指令和注释、描述、方法、类等其他信息。在 C# 程序中所有类型和成员都会有一组指定的元数据用于描述它们也允许自定义特性来描述其他任何信息。可以将一个或多个特性应用于整个程序集、模块或较小的程序元素例如类和属性。特性也可以像方法和属性一样接收自变量。可以使用反射1来查看当前程序集或其他程序集的元数据的信息。 1.2 特性的用途 在项目中特性的常见用途包括但不限于以下几点 在 Web 服务中使用 WebMethod 特性标记方法时表示该方法应可通过 SOAP 协议2进行调用。用于描述与本机代码互操作时如何封送方法参数。描述类、方法和接口的 COM 属性。从标题、版本、说明或商标方面描述程序集。通过实时 (JIT) 编译器3控制优化这样代码就一直都易于调试。 .Net 框架中提供了两种类型的特性预定义特性和自定义特性。 2特性的定义 在 C# 中特性的定义是使用方括号 ([]) 将特性名称括起来并放置在特性目标4的声明上方已指定特性。可以将特性附加到几乎任何声明中尽管有些特性会限制有效附加到某些声明的类型。 特性的定义的语法可以总结为如下 [attribute(positional_parameters, name_parameter value, …)] element positional_parameters 表示特性必须具备的信息。name_paramete表示特性可选的信息。element 在这里表示特性目标4。 代码示例 using System; [Serializable] public class SampleClass {// 该类型的对象可以被序列化。 }在此示例中SerializableAttribute 特性用于将具体特征作用于 SampleCLass 类。 2.1 特性参数 特性参数包括位置参数、未命名参数和已命名参数。其中位置参数必须以特定的顺序来指定且不能省略。而命名参数是可选参数通过名称来指定可以通过任何顺序来指定。 代码示例 [DllImport(user32.dll)] [DllImport(user32.dll, SetLastErrorfalse, ExactSpellingfalse)] [DllImport(user32.dll, ExactSpellingfalse, SetLastErrorfalse)]上面的实例中的三个特性都是等同的。第一个参数是位置参数DLL 名称始终作为第一个参数出现。位置参数与特性构造函数的参数相对应。而已命名或可选参数与特性的字段或属性相对应。 点击了解更多特性参数的使用。 2.2 特性目标 特性目标指的是应用特性的实体。例如特性目标可以是类、特定方法或整个程序集。一般情况特性应用于紧跟在它后面的元素。不过C# 特性支持显示标识例如可以显示标识为将特性应用于方法或者是应用于其参数或返回值。 显示标识特性目标的语法如下 [target : attribute-list] target表示指定的特性目标值。attribute-list表示要应用的特性列表。 下表展示常用的 target 值 目标值适用对象assembly整个程序集module当前程序集模块field类或结构中的字段event事件method方法或 get 和 set 属性访问器param方法参数或 set 属性访问器参数propertyProperty属性return方法、属性索引器或 get 属性访问器的返回值type结构、类、接口、枚举或委托 代码示例 以下示例演示如何将特性应用于方法、方法参数和方法返回值。 // 默认: 应用于方法 [ValidatedContract] int Method1() { return 0; }// 显示指定应用于方法 [method: ValidatedContract] int Method2() { return 0; }// 应用于参数 int Method3([ValidatedContract] string contract) { return 0; }// 应用于返回值 [return: ValidatedContract] int Method4() { return 0; }以下示例演示如何将特性应用于程序集和模式。 using System; using System.Reflection;[assembly: AssemblyTitleAttribute(Production assembly 4)] [module: CLSCompliant(true)]点击了解更多特性目标的使用。 3预定义特性 所谓的预定义特性就是在 .NET 框架中预先定义好的特性使得程序代码在编译之前就能被读取。在 .NET 框架中提供了三种预定义特性分别为 AttributeUsage 、Conditional 、Obsolete 。 3.1 AttributeUsage 特性 AttributeUsage 是属性使用的意思用于描述特性类的使用方式。其中包括如何使用一个自定义特性类以及特性可应用到的项目的类型。注意使用特性修饰的类 AttributeUsage 必须 System.Attribute 直接或间接派生类否则将发生编译时错误。 AttributeUsage 特性的语法如下 [AttributeUsage(validon, AllowMultipleallowmultiple, Inheritedinherited)] 参数 validon 表示可被应用的特性目标值。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All。上述的特性目标中的表格也展示了常用特性目标值。参数 AllowMultiple 是一个可选的allowmultiple 选项为其提供一个布尔值。如果为 true则该特性是多用的如果为 false则该特性是单用的。默认为 false 表示单用的。参数 Inherited 也是可选的inherited 选项为其提供一个布尔值。如果为 true表示则该类可被派生类继承。如果为 false表示不能被继承。默认为 false 表示不可继承。 代码示例 using System;// AttributeUsage 特性应用于 ExampleAttribute 类。 [AttributeUsage(AttributeTargets.Class, AllowMultiple false, Inherited false)] public class ExampleAttribute : Attribute {// 构造函数 public ExampleAttribute(String Description_in){this.description Description_in;}// description 字段public String description;// Description 属性public String Description{get{return this.description;}} }因为上例中的 AttributeUsage 特性的 validon 参数被设置为 AttributeTargets.Class 所以只能将特性应用于类对象。而不能应用其他对象例如方法等。示例如下 [Example(Can be applied to classes)] public class MyClass {[Example(Cannot be applied to fields)] // 错误 public String MyField; }代码效果 上例中的 AllowMultiple 参数为 false 表示该特性不能被重复应用多次。示例如下 [Example(Cannot be applied more than once)] [Example(Cannot be applied more than once)] // 错误 public class MyClass {// 类成员…. }代码效果 上例中的 Inherited 参数为 false表示该特性类不能被继承。示例如下 [Example(BaseClass)] public class Base {// 类成员…. }public class Derive : Base {// 子类成员…. }public class Program {static void Main(string[] args){// 得到指定类型的Type对象Type BaseType typeof(Base);Type DeriveType typeof(Derive);Console.WriteLine(BaseType); // BaseConsole.WriteLine(DeriveType); // Derive// 判断当前的方法是否应用了Example特性bool BaseDef Attribute.IsDefined(BaseType, typeof(ExampleAttribute));bool DriveDef Attribute.IsDefined(DeriveType, typeof(ExampleAttribute));Console.WriteLine(BaseDef); // TrueConsole.WriteLine(DriveDef); // False} }运行效果 上例中 使用 Attribute.IsDefined 方法检测到了 Base 类中应用了 ExampleAttribute 特性但是 Derive 派生类却没有应用到。因为 Inherited 参数被设置为 false 所以 Derive 类不能继承到 ExampleAttribute 特性。 3.2 Conditional 特性 Conditional 是有条件的意思。使用特性修饰的方法也就是条件方法条件方法的执行依赖于指定的预处理标识符。预处理标识符影响着方法调用的条件编译这种影响取决于指定的值。例如事先用预处理器指令定义了一个 Test 字符当条件方法指定的值也为 Test 时 则该方法会被执行。 Conditional 特性的语法如下 [Conditional(conditionalSymbol)] 参数 conditionalSymbol 表示指定的预处理标识符。 代码示例 #define Test using System; using System.Diagnostics;public class Example {[Conditional(Test)]static void Method1(){Console.WriteLine(Method1);}static void Method2(){Console.WriteLine(Method2);}static void Main(){Method1();Method2();} }运行效果
上例中在程序编译之前使用预处理器指令定义了 Test 字符。在使用 Conditional 修饰符修饰了条件方法 Method1 中又定义了 Test 的指定值所以 Method 方法可以顺利运行。 代码示例 //#define Test运行效果 反之当 Test 指定值没有定义时被注释Method 方法就不能运行。 条件方法的使用收到以下几点限制 条件方法必须应用在类类型或者结构体类型上。比方说如果在接口类型上制定了 Conditional 特性则会发生编译错误。条件方法不能使用 override 修饰符不过条件方法允许使用 virtual 修饰符。此类方法指的是 virtual 关键字修饰的虚方法的替代是隐式条件的不能用特性显式标记 Conditional 。条件方法的返回类型必须为 void也就是不能有返回对象。 3.2.1 条件特性类 条件特性类是使用一个或多个 Conditional 特性修饰的特性类。因此条件特性类与在其特性中声明的条件编译符号需要关联 Conditional 。 示例如下 文件 test.cs using System; using System.Diagnostics;[Conditional(DEBUG)] public class TestAttribute : Attribute { }文件 test1.cs #define DEBUG[Test] // 指定TestAttribute class Class1 {}文件 test2.cs #undef DEBUG[Test] // 未指定TestAttribute class Class2 {}上例中的类 Class1 和 Class2 都是用特性类修饰的 Test 前者定义了条件 DEBUG而后者是基于否定条件 DEBUG 。由于此符号在当前上下文定义的而不是在基类的上下文定义的。所以类 Class1 和 Class2 属性会被 Test Class1 和 Test Class2 忽略。 3.3 Obsolete 特性 Obsolete 是过时的意思用于标记不应再使用的类型和类型的成员。使用这个特性相当于告诉编译器丢弃某个特定的目标元素当使用某个用 Obsolete 特性应用的对象时编译器会报出错误。在实际项目中当一个新方法用在一个类中但开发者还想保留类中的旧方法时就可以把他标记为 obsolete过时的。 Obsolete 特性的语法如下 [Obsolete(message,iserror)] 参数 message 是字符串类型描述应用的项目为什么过时以及该替代使用什么。参数 iserror 是布尔值类型当布尔值为 true 时编译器会把项目的使用当成一个错误反之为 false 时编译器会生成一个警告。iserror 参数是可选的默认值为 false 。 代码示例 using System;public class Example {[Obsolete(不要使用OldMethod而是使用NewMethod, true)]static void OldMethod(){Console.WriteLine(这是旧方法);}static void NewMethod(){Console.WriteLine(这是新方法);}public static void Main(){OldMethod();} }代码效果 当把参数 iserror 换成 false 时编译器就会生成一个警告。 代码示例 [Obsolete(不要使用OldMethod而是使用NewMethod, false)]代码效果
4自定义特性 在 C# 中允许我们定义特性类来创建自己的自定义特性特性类直接或间接派生自 Attribute 的类。 自定义特性可用于存储声明性的信息且可在运行时被检索。自定义特性可根据项目的实际需求进行变动可与任何目标元素相关。 创建并使用自定义特性可总结为以下四个步骤 声明自定义特性。构建自定义特性。在需要应用特性的对象上放置自定义特性。通过反射1访问特性。暂时不讨论 4.1 声明自定义特性 声明一个 Author 的特性类此类是用来存储作者的姓名和年龄信息的类型。且特性的目标值设置为 Class 和 Struct 表示可被应用的对象仅为类和结构体。 代码示例 using System;[System.AttributeUsage(System.AttributeTargets.Class |System.AttributeTargets.Struct) ] public class AuthorAttribute : System.Attribute在上面的示例中由于该类派生自 System.Attribute 因此它是一个自定义特性类。 4.2 构建自定义特性 构建自定义特性 AuthorAttribute该特性存储了作者的姓名name和年龄age。 代码示例 using System;[System.AttributeUsage(System.AttributeTargets.Class |System.AttributeTargets.Struct) ] public class AuthorAttribute : System.Attribute {private string name;public double age;// 构造函数public AuthorAttribute(string name){this.name name;age 11;} }在上例的构建自定义特性中声明了两个字段分别为 name 和 age 。再使用构造函数对其赋值。需要注意的是name 是位置参数。 所有公共读写字段或属性都是命名参数。 在本例中version 是唯一的命名参数。 4.3 应用自定义特性 可通过将一个或多个 Author 特性放置在类或结构体上方进行应用。 代码示例 [Author(writer桑, age 21)] public class Example {// Example类成员 }结语 以上就是 C# 特性的介绍啦希望能够对大家有所帮助。望大家多多支持你们的支持就是笔者创作最大的动力 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 ↩︎ ↩︎ SOAP 是基于 XML 的简易协议可使应用程序在 HTTP 之上进行信息交换。或者更简单地说SOAP 是用于访问网络服务的协议。 ↩︎ JIT是一种提高程序运行效率的方法。 ↩︎ 特性目标是指应用特性的实体。 ↩︎ ↩︎