博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#学习笔记(十六):Attribute
阅读量:5163 次
发布时间:2019-06-13

本文共 2921 字,大约阅读时间需要 9 分钟。

Attribute可以为类或方法添加一些附加的信息,我们可以看看MSDN对Attribute的描述:

公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。

在.NET中,Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。

内置Attribute

C#为我们提供了一些用来处理特定一些问题,我们接下来看看几个简单的特性:

Conditional

满足指定条件才会调用指定的方法。

1 using System; 2 using System.Diagnostics; 3  4 namespace Study 5 { 6     class Program 7     { 8         static void Main(string[] args) 9         {10             Func();11 12             Console.Read();13         }14 15         [Conditional("DEBUG")]16         private static void Func()17         {18             Console.WriteLine("I am a DEBUG function!");19         }20     }21 }

在DEBUG模式下运行可以看见字符串输出,而在RELEASE模式下Func不会被调用。

Obsolete

可以指定类或方法是否已经被弃用,第一个参数为描述字符串,第二参数可以指定使用了类或方法时是否直接抛错。

1 using System; 2 using System.Diagnostics; 3  4 namespace Study 5 { 6     class Program 7     { 8         static void Main(string[] args) 9         {10             Func();11 12             Console.Read();13         }14 15         [Obsolete("Don`t use this method!", true)]16         private static void Func()17         {18             Console.WriteLine("I am a DEBUG function!");19         }20     }21 }

呵呵,自己运行看看效果吧。

Serializable

使用这个特性可以实现类的序列化和反序列化效果。

1 using System; 2 using System.IO; 3 using System.Runtime.Serialization; 4 using System.Runtime.Serialization.Formatters.Binary; 5  6 namespace Study 7 { 8     class Program 9     {10         static void Main(string[] args)11         {12             Test test = new Test {name = "LiLei", age = 18};13 14             byte[] bytes = ObjectToBytes(test);15             Test test2 = BytesToObject(bytes) as Test;16 17             Console.WriteLine("name: " + test2.name + ", age: " + test2.age);18 19             Console.Read();20         }21 22         public static byte[] ObjectToBytes(object obj)23         {24             using(MemoryStream ms = new MemoryStream())25             {26                 IFormatter formatter = new BinaryFormatter();27                 formatter.Serialize(ms, obj);28                 return ms.GetBuffer();29             }30         }31 32         public static object BytesToObject(byte[] Bytes)33         {34             using(MemoryStream ms = new MemoryStream(Bytes))35             {36                 IFormatter formatter = new BinaryFormatter();37                 return formatter.Deserialize(ms);38             }39         }40     }41 42     [Serializable]43     public class Test44     {45         public string name;46         public int age;47     }48 }

注意可以使用两个静态序列化方法的对象必须是使用了Serializable特性的对象。

自定义Attribute

除了使用官方提供的特性以外,我们也可以根据自身的需求自定义一个自己的特性,具体使用方法如下:

  1. 新建一个类继承自System.Attribute,名称需要以Attribute结尾,比如VersionAttribute,我们可以给该类添加我们需要的属性。
  2. 使用时可用“[VersionAttribute]”或“[Version]”定义一个Attribute,同时可以设置属性。
  3. 具体使用时一般是使用反射的方式把我们需要的信息取出再进行处理。

给出几个不错的文章:

转载于:https://www.cnblogs.com/hammerc/p/4615920.html

你可能感兴趣的文章
B. An express train to reveries(Round 418)
查看>>
不要逼孩子考100分
查看>>
Python(四)
查看>>
Symbols of String Pattern Matching
查看>>
如何判断一个人的能力
查看>>
【学习笔记】 狄利克雷与莫比乌斯
查看>>
关于 DataRow 中为 DataRowState.Deleted 状态的 字段列值取值方法
查看>>
724.Find Pivot Index
查看>>
小牛必会之—monkey
查看>>
python3.6.3安装步骤,适用linux centos系统
查看>>
没有终结点在侦听可以接受消息的*这通常是由于不正确的地址或者 SOAP操作导致的...
查看>>
HTML5---15.网络接口
查看>>
接收xml请求流并解析字符串的例子
查看>>
中文字符串分隔的注意问题
查看>>
zip打包是去掉路径
查看>>
常用的经典jquery代码[转]
查看>>
正则判断
查看>>
转--RTP如何打包H264数据
查看>>
IOC及AOP实现原理
查看>>
CocoaPods安装和使用教程
查看>>