推荐阅读:
特性
用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。
Net 框架提供了三种预定义特性:
AttributeUsage
Conditional
Obsolete
反射
反射指程序可以访问、检测和修改它本身状态或行为的一种能力。
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。
反射(Reflection)有下列用途:
它允许在运行时查看特性(attribute)信息。
它允许审查集合中的各种类型,以及实例化这些类型。
它允许延迟绑定的方法和属性(property)。
它允许在运行时创建新类型,然后使用这些类型执行一些任务。
属性
使用 访问器(accessors) 让私有域的值可被读写或操作。例如:有一个名为 Student 的类,带有 age私有域。我们不能在类的范围以外直接访问这些域,但是我们可以拥有访问这些私有域的属性。
代码实现如下:
using System;
namespace 属性
{
class Student
{
private int age = 0;
// 声明类型为 int 的 Age 属性
public int Age
{
get
{
return age;
}
set
{
age = value;
}
}
}
class ExampleDemo
{
public static void Main()
{
// 创建一个新的 Student 对象
Student s = new Student();
s.Age = 9; //9
// 增加年龄
s.Age += 1; //10
Console.ReadKey();
}
}
}
索引器
允许一个对象可以像数组一样被索引。当为类定义一个索引器时,该类的行为就会像一个虚拟数组(virtual array) 一样。可以使用数组访问运算符 [ ] 来访问该类的实例。
格式如下:
//索引器定义的时候带有 this 关键字,它指向对象实例
element-type this[int index]
{
// get 访问器
get
{
// 返回 index 指定的值
}
// set 访问器
set
{
// 设置 index 指定的值
}
}
下面举个例子来看看索引器如何使用:
using System;
namespace 索引器
{
class IndexedNames
{
private string[] namelist = new string[size];
static public int size = 10;
//初始化每个元素的值
public IndexedNames()
{
for (int i = 0; i < size; i++)
namelist[i] = "N. A.";
}
public string this[int index]
{
//取值,输出时用到
get
{
string tmp;
if( index >= 0 && index <= size-1 )
{
tmp = namelist[index];
}
else
{
tmp = "";
}
return ( tmp );
}
//设置值,重置值得时候使用
set
{
if( index >= 0 && index <= size-1 )
{
namelist[index] = value;
}
}
}
static void Main(string[] args)
{
IndexedNames names = new IndexedNames();
names[0] = "被重置后的值";
for ( int i = 0