一、属性
属性的含义
属性是代表类的实例或类中的一个数据项的成员。属性是指定的一组匹配的、称为访问器的方法。
set访问器为属性赋值
get访问器读取属性
属性特征
属性是命名的类成员
属性有类型
属性可以被赋值和读取
属性是一个函数成员
属性不为数据存储分配内存
属性可以执行代码块
属性声明和访问器
set访问器
拥有一个隐式的类型和属性类型相同的值参--value
拥有一个返回类型--void
get访问器
没有参数
拥有一个和属性类型相同的返回类型
声明格式:(属性中只允许有get和set访问器,顺序随意)

属性常与字段相关联
一种常见的方式是将字段私有化,然后关联一个public属性来控制类的外部对该字段的访问。(与属性相关联的字段称为后备字段或后备存储)代码示例如下:

图解示例如下:

可以在get和set访问器中执行代码,例如下图:

只读和只写属性
只有get访问器的属性称为只读属性。
只有set访问器的属性称为只写属性。
属性中至少存在一种访问器。

属性与公共字段
属性是函数成员而不是数据成员,允许你处理输入和输出,而公共字段不行。
属性可以只读或只写,而公共字段不行。
编译后的变量和编译后的属性语义不同。属性后期修改更容易。
自动实现属性
因为属性经常关联字段,C#提供了自动实现属性,允许只声明属性而不声明后备字段。编译器会为你创建隐藏的后备字段,并自动挂接到get和set访问器上。要点如下:
不声明后备字段--编译器根据属性的类型分配存储。
不能提供访问器的方法体--它们必须被简单的声明为分号。
除非通过访问器,否则不能访问后备字段。因为不能用其他的方法访问它,所以实现只读和只写属性没有意义,必须同时提供读写访问器。


静态属性
属性也可声明为静态的,静态属性的访问器和所有静态成员一样,具有以下特点:
不能访问类的实例成员
不管类是否有实例,静态属性都是存在的
从外部访问静态属性时,使用类名引用,而不是实例名
二、 this关键字
this关键字在类中使用,是对当前实例的引用。
可使用的位置:
实例构造函数
实例方法
属性和索引器的实例访问器
不可使用位置:
不能在任何静态函数成员中使用this关键字。因为静态成员不是实例的一部分。
this的作用目的:
用于区分类的成员或本地变量或参数
作为调用方法的实参
三、索引器
什么是索引器
索引器是一组get和set访问器,和属性类似。通过提供索引器,可以在许多可能的数据成员中进行选择。一个string类型索引器示例如下:

属性和索引器
属性和索引器都被主要用来访问其他数据成员,提供获取和设置访问。
属性通常表示单独的数据成员
索引器通常表示多个数据成员
和属性一样,索引器不用分配内存来存储。
和属性一样,可以设置只读或只写
和属性一样,get和set可以做任何事也可以什么都不做,只要get返回对应类型即可。
索引器总是实例成员,所以不能声明为static
索引器本身可以是任何类型,不仅仅是数值类型。
声明索引器
注意点:
索引器没有名称,在名称位置是关键字this
参数列表在方括号中间
参数列表中必须至少声明一个参数
声明示例:

索引器和属性声明对比

索引器的get和set访问器
索引器的set访问器
set访问器材被调用,接受下列两项数据
一个隐式参数,名称为value,value持有要保存的数据
一个或更多参数索引,表示数据应该要保存到哪里
set访问器的语法和含义如下图(左语法,由含义):

索引器的get访问器
它的参数列表和索引器声明中的相同
它返回与索引器相同类型的值

索引器的重载
只要索引器的参数列表不同,类就可以有任意多个索引器。
类中重载的索引器必须有不同的参数列表。
索引器代码示例:
class Employee
{
public string LastName;//调用字段0
public string FirstName;//调用字段1
public string City;//调用字段2
public string this[int index]
{
get
{
switch (index)
{
case 0: return LastName;
case 1: return FirstName;
case 2: return City;
default:
throw new InvalidOperationException("index");
}
}
set
{
switch (index)
{
case 0:
LastName = value;
break;
case 1: FirstName = value;
break;
case 2: City = value;
break;
default:
throw new ArgumentOutOfRangeException("index");
}
}
}
}
//使用索引器
static void Main(string[] args)
{
Employee emp = new Employee();
//设置根据索引器下标,设置对应的字段值
emp[0] = "光";
emp[1] = "头强";
emp[2] = "森林";
//根据索引器下标,获取对应的字段
Console.WriteLine("LastName = {0},FirstName = {1},City = {2}", emp[0], emp[1], emp[2]);
}
(注:本章学习总结自《C#图解教程》)