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的顺序完成的. 它是一个带有索引的集合,通过索引就可以精 ...
随机推荐
- IIS Server is too busy 解决方法(IIS6)
Server is too busy意思是服务器繁忙,资源不够用 为什么会出现这个问题呢? 因为服务器的配置不同,所能承受的压力不同. 而服务器默认对链接数,线程数等有设置,但这个设置太小,基本不够用 ...
- dagli最早干了这样一件事儿 Localization of Cardiac-Induced Signal Change in fMRI
Localization of Cardiac-Induced Signal Change in fMRI 这篇文章是最早做生理噪声相关组织的定位的. 很奇特,因为,这位学者甚至得出了,血管心动等变化 ...
- 01day1
最大音量 动态规划 题意:给出一个初始值和一个变化序列 c,在第 i 步可以加上或减去 c[i],求 n 步之后能达到的最大值.有一个限定值 maxlevel,在变化过程中值不能超过 maxlevel ...
- 【C#学习笔记】LinkedList容器使用
using System; using System.Collections.Generic; namespace ConsoleApplication { class Program { stati ...
- LeetCode: pow
Title: https://leetcode.com/problems/powx-n/ 思路:二分.使用递归或者非递归.非递归有点难理解.pow(0,0)=1 递归的方法是将n为负数的用除法解决.有 ...
- FFMPEG视音频编解码零基础学习方法
在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“ ...
- Java基础——异常处理
异常的层次结构 所有的异常类都是 java.lang.Exception 类的子类型.异常类都是 Throwable 类的子类.除了异常类 Error 类也是由 Throwable 类产生的的子类1. ...
- 【再见RMQ】NYOJ-119-士兵杀敌(三),区间内大小差值
[题目链接:NYOJ-119] 思路:转自 点我 ,讲的挺好. #include <cstdio> #include <math.h> #define max(a,b) ((a ...
- .NET之美——1.1 C#中的泛型
1.1 C#中的泛型 .Net 1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持.通过使用泛型,我们可以极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱.拆箱,在一定程度上提升 ...
- 自定义TreeList单元格 z
DevExpress Treelist自定义单元格,加注释和行序号.以上一节的列表为例,实现以下效果:预算大于110万的单元格突出显示,加上行序号以及注释,如下图: 添加行序号要用到CustomDra ...