山间之风

It's time to perform mogic (

LINQ与数据处理

1 作为语法糖的LINQ1.1 IEnumerable 接口LINQ只能用于查询IEnumerable的集合,接下来通过例程来演示IEnumerable对象的构建方法与其特性。 using System; using System.Collections; // 一个测试类 public class Person { public Person(string fName, string lName) { this.firstName = fName; this.lastName = lName; } public string firstName; public string lastName; } // 定义了一个IEnumerable的集合,集合中元素是上文定义的Person对象 public class People : IEnumerable { private Person[] _people; public People(Person[] pArray) { _people = new Person[pArray.

C#中的反射

1 反射与其在C#中的用途1.1 什么是反射反射是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 要注意术语“反射”和“内省”(type introspection)的关系。内省(或称“自省”)机制仅指程序在运行时对自身信息(称为元数据)的检测;反射机制不仅包括要能在运行时对程序自身信息进行检测,还要求程序能进一步根据这些信息改变程序状态或结构。 摘自wikipedia “反射” 词条1.2 在C#中使用反射接下来介绍几个使用反射的实际应用,通过例程来展示反射在C#中的用途。 1.2.1 使用反射访问实体的Attribute在先前关于Attribute的介绍中有提到这样的使用方式,通过反射来查看类或者某个成员变量的标签值,这样可以扩展Attribute的用途。例程如下: using System; using System.Reflection; namespace ConsoleApp1 { // 自定义一个Attribute,

Attribute的应用场景探讨

1 预定义Attribute应用1.1 控制XML序列化通过给class中不同元素打上Attribute,可以在对该对象进行xml序列化时,指定xml标签的值。例程如下: using System; using System.IO; using System.Xml.Serialization; namespace ConsoleApp1 { // 给元素标注信息 [XmlRoot("部门")] public class Department { public string DeptName { get; set; } [XmlElement("附加信息")] public string DeptExtraInfo { get; set; } // 允许非空元素 [XmlElement(IsNullable = true)] public string DeptLocation { get; set; } } class Program { public static string

C#中的Attribute

dotNet框架中的内置AttributeAttributeUsageAttributeUsage是用于自定义新的特性类的标签,从这一自定义的流程,可以看出所谓的Attribute实质上是一个特殊的对象,用于对其他类的修饰与标注。 ConditionalConditional特性主要用于标注编译器的预处理条件,相较于传统的#if DEBUG 等预处理指令,使用Conditional特性的[Conditional("DEBUG")]更能够适应对性能要求较高的项目开发。这是因为运行时在读取预处理指令时,JIT编译器会将符合或不符合预处理条件的指令都进行调用,不能被编译成IL。而使用Conditional特性的则能被JIT编译器识别,生成性能更高的IL。 ObsoleteObsolete是一个用于提供编译时警告的标签,其用途主要是标记某个不该被使用的模块,比如旧的函数与类。在编译时,如果代码中有部分被标注了Obsolete,则编译器会抛出一条警告,警告内容为Obsolete标签中定义的值。 从装饰器到Attribute作为一个学过多种程序设计语言的开发者,上手C#中Attribute相关文档的时候第一时间就想到了Python中的装饰器。 在Python中,装饰器主要用于修饰函数或类,事实上Python中的装饰器就是一个函数,其本质上是一个套在原函数外层的特殊函数,使得原函数成为一个闭包,从而实现某些高级功能。 而对C#来说,这个设计之初就以面向对象作为开发纲领的语言,其并没有Python那样浓郁的函数式编程的味道,粗看Attribute似乎只是作为一种特殊的标记与注释(aka. meta data),只不过其是写给编译器看的罢了。然而在经过一些更为深入的了解后,我意识到,通过反射,C#与Attribute能做到更多。 反射与Attribute通过反射的方式,可以在程序运行过程中,