属性(Property)
属性的概念
- 字段:是在类或结构中直接声明的任意类型的变量。
- 属性:使用访问器(accessors)读取或者操作字段,本身是不保存任何数据的。
- 属性出现的范围:类(class)、结构(structure)和接口(interface)。
- 本质上:属性其实也是方法,不过是用来读取操作字段的,反编译就可以看到set和get其实是方法。
访问器
- 访问器(accessors):包含助于获取(读取或者计算)或设置(写入)属性的可执行语句。
- 分类:get访问器、set访问器。
属性声明和使用的演示
声明:分为自动属性语法和自定义存储,使用 get 和 set 访问器来定义属性。
使用:用“.属性名字”当成字段读取和赋值就行了。
- 自动属性语法
namespace Blog1
{
class Program
{
public class Person
{
//自动属性语法
public string Name
{
get;
set;
}
}
static void Main(string[] args)
{
Person person = new Person();
//属性使用,“.属性名字”当成字段读取和赋值就行了
person.Name = "小明";
Console.WriteLine(person.Name);
Console.ReadKey();
}
}
}
/*输出:
小明
*/
- 自行定义存储
注意:需要先定义一个字段,命名规则一般为字段首字母小写,属性则大写。
public class Person
{
//需要先定义一个字段,命名规则一般为字段首字母小写,属性则大写
private string name;
//自定义存储
public string Name
{
get
{
return name;
}
set
{
if (value != null)
{
name = value;
}
else
{
name = "某某";
}
}
}
}
抽象属性
public abstract class Person
{
public abstract string Name
{
get;
set;
}
}
public class Student : Person
{
private string name;
public override string Name
{
get
{
return name;
}
set
{
name = (value==null)?"某某":value;
}
}
}
接口属性
interface ITalk
{
string Talk
{
get;
set;
}
}
public class Student : ITalk
{
private string talk;
public string Talk
{
get
{
return talk;
}
set
{
talk = (value==null)?"C#不错!":value;
}
}
}
索引器(Indexer)
索引器使用
- 索引器:允许一个对象可以像数组一样被所有。让被定义为索引器的类,可以像数组一样通过运算符“[ ]”来访问该类的实例。
- 索引器声明:类似于属性,使用 get 和 set 访问器来定义索引器。
namespace Blog1
{
public class Student
{
//学生课程分数对应关系
private Dictionary<string, float> DirCrouses=new Dictionary<string, float >();
public float this[string courseName]
{
get
{
if(this.DirCrouses.ContainsKey(courseName))
return DirCrouses[courseName];
else
return 0;
}
set
{
//分数输入在不在范围内
if (value < 0 || value > 100)
{
throw new Exception("Score out of range");
}
if (this.DirCrouses.ContainsKey(courseName))
{
this.DirCrouses[courseName] = value;
}
else
{
this.DirCrouses.Add(courseName, value);
}
}
}
}
class Program
{
static void Main(string[] args)
{
Student student = new Student();
student["Math"] = 90;
student["Chinese"] = 100;
Console.WriteLine(student["Chinese"]);
Console.ReadKey();
}
}
}
/*输出:
100
*/
重载索引器
public class Student
{
//学生课程分数对应关系
private Dictionary<string, float> DirCrouses = new Dictionary<string, float>();
//学生每个年纪的学历
private string[] education = new string[250];
public float this[string courseName]
{
get
{
if (this.DirCrouses.ContainsKey(courseName))
return DirCrouses[courseName];
else
return 0;
}
set
{
if (value < 0 || value > 100)
{
throw new Exception("Score out of range");
}
if (this.DirCrouses.ContainsKey(courseName))
{
this.DirCrouses[courseName] = value;
}
else
{
this.DirCrouses.Add(courseName, value);
}
}
}
//重载
public string this[int age]
{
get
{
return this.education[age];
}
set
{
this.education[age] = value;
}
}
}
属性和索引器的同异
同:
- 索引器是属性的一种,所以它实质上也是方法(函数),都不用分配内存来存储。
- 主要都是用来访问其它数据成员,为它们提供读取和操作。
异:
- 属性名可以自定义,索引器必须以this命名。
- 属性可以是实例或静态,而索引器必须是实例。
- 索引器可以被重载,属性不行。
- 属性的get访问器没有参数,索引器的get访问器具有和索引器相同的形参表。
- 属性的set访问器包含隐藏value参数,索引器的set访问器除了value参数外,还具有和索引器相同的形参表。
- 属性通过简单名称访问,索引器通过索引访问。