C#学习笔记(十六):Attribute
Attribute可以为类或方法添加一些附加的信息,我们可以看看MSDN对Attribute的描述:
公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
在.NET中,Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。
内置Attribute
C#为我们提供了一些用来处理特定一些问题,我们接下来看看几个简单的特性:
Conditional
满足指定条件才会调用指定的方法。
using System;
using System.Diagnostics; namespace Study
{
class Program
{
static void Main(string[] args)
{
Func(); Console.Read();
} [Conditional("DEBUG")]
private static void Func()
{
Console.WriteLine("I am a DEBUG function!");
}
}
}
在DEBUG模式下运行可以看见字符串输出,而在RELEASE模式下Func不会被调用。
Obsolete
可以指定类或方法是否已经被弃用,第一个参数为描述字符串,第二参数可以指定使用了类或方法时是否直接抛错。
using System;
using System.Diagnostics; namespace Study
{
class Program
{
static void Main(string[] args)
{
Func(); Console.Read();
} [Obsolete("Don`t use this method!", true)]
private static void Func()
{
Console.WriteLine("I am a DEBUG function!");
}
}
}
呵呵,自己运行看看效果吧。
Serializable
使用这个特性可以实现类的序列化和反序列化效果。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary; namespace Study
{
class Program
{
static void Main(string[] args)
{
Test test = new Test {name = "LiLei", age = }; byte[] bytes = ObjectToBytes(test);
Test test2 = BytesToObject(bytes) as Test; Console.WriteLine("name: " + test2.name + ", age: " + test2.age); Console.Read();
} public static byte[] ObjectToBytes(object obj)
{
using(MemoryStream ms = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
return ms.GetBuffer();
}
} public static object BytesToObject(byte[] Bytes)
{
using(MemoryStream ms = new MemoryStream(Bytes))
{
IFormatter formatter = new BinaryFormatter();
return formatter.Deserialize(ms);
}
}
} [Serializable]
public class Test
{
public string name;
public int age;
}
}
注意可以使用两个静态序列化方法的对象必须是使用了Serializable特性的对象。
自定义Attribute
除了使用官方提供的特性以外,我们也可以根据自身的需求自定义一个自己的特性,具体使用方法如下:
- 新建一个类继承自System.Attribute,名称需要以Attribute结尾,比如VersionAttribute,我们可以给该类添加我们需要的属性。
- 使用时可用“[VersionAttribute]”或“[Version]”定义一个Attribute,同时可以设置属性。
- 具体使用时一般是使用反射的方式把我们需要的信息取出再进行处理。
给出几个不错的文章:
http://www.cnblogs.com/hyddd/archive/2009/07/20/1526777.html
http://www.cnblogs.com/luckdv/articles/1682488.html
C#学习笔记(十六):Attribute的更多相关文章
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- (C/C++学习笔记) 十六. 预处理
十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...
- JavaScript权威设计--CSS(简要学习笔记十六)
1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...
- MySQL学习笔记十六:锁机制
1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...
- SharpGL学习笔记(十六) 多重纹理映射
多重纹理就把多张贴图隔和在一起.比如下面示例中,一个表现砖墙的纹理,配合一个表现聚光灯效果的灰度图,就形成了砖墙被一个聚光灯照亮的效果,这便是所谓的光照贴图技术. 多重纹理只在OpenGL扩展库中才提 ...
- yii2源码学习笔记(十六)
Module类的最后代码 /** * Registers sub-modules in the current module. * 注册子模块到当前模块 * Each sub-module shoul ...
- Swift学习笔记十六:协议
Protocol(协议)用于统一方法和属性的名称,而不实现不论什么功能. 协议可以被类.枚举.结构体实现.满足协议要求的类,枚举,结构体被称为协议的遵循者. 遵循者须要提供协议指定的成员,如属性,方法 ...
- PHP学习笔记十六【方法】
<?php //给一个函数传递基本数据类型 $a=90; $b=90.8; $c=true; $d="hello world"; function test1($a,$b,$ ...
- Java基础学习笔记十六 集合框架(二)
List List接口的特点: 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的. 它是一个带有索引的集合,通过索引就可以精 ...
随机推荐
- Java注解实践
Java注解实践 标签 : Java基础 注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK ...
- css虚线和css双实线
border线型主要有:1.dotted[点状]2.solid[实线] 3.double[双实线] 4.dashed;[虚线] 如果一个CSS这样写:border-style:dotted solid ...
- Azure SQL 数据库最新版本现已提供预览版
Tiffany Wissner 数据平台营销高级总监 我们之前在11月宣布将提供新的预览版,在该预览版中我们引入了接近完整的 SQL Server 引擎兼容性和更为高级的性能,这些都代表了下一代的 ...
- fmri当前相关软件工具整理
1.spm; 2.afni; 3.fsl; 4.drtools; 5.prtools; 6.phycaa+; 7.cca-fmri;
- linux面试题2
1. 在Linux系统中,以文件的方式访问设备 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统 3. Linux文件系统中每个文件用inode来标识 4. 链接分为 ...
- CMake实践(2)
一,本期目标: [~@localhost t2]$ cat README this is README├── CMakeLists.txt├── COPYRIGHT├── doc│ └── hel ...
- UTF-8编码规则
UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所 ...
- InnoDB一定会在索引中加上主键吗
InnoDB一定会在索引中加上主键吗 http://www.penglixun.com/tech/database/will_innodb_store_pk_in_index.html
- C++ 函数重载与函数匹配
<C++ Primer>笔记,整理关于函数重载与函数匹配的笔记. 函数重载 void func(int a); //原函数 void func(double a); //正确:形参类型不同 ...
- <转>如何测试大型ERP软件?
大型ERP软件是一个在企业范围内部应用的.高度集成的软件,且操作频繁,数据在各业务系统之间高度共享.那么针对大型ERP软件的特点,我们应该怎么测试呢?要使用怎样的测试方法?需要什么样的测试人员?... ...