属性是对现实世界中实例特征的抽象,它提供对类或对象性质的访问。例如人的姓名、年龄、体重和身高等都可以作为属性。类的属性所描述的是状态信息,在类的某个实例中属性的值表示该对象的状态值。
在C#中,通过访问器来访问属性,使用get访问器和set访问器对属性的值进行读写。
一、属性的声明
下面的代码是一个完整的属性声明:
private string computer; // 私有的computer字段
public string Computer
{
get
{
return computer;
}
set
{
computer = value;
}
}
为什么要使用属性?为了不让所有人随便访问修改变量,我们需要为变量设置读写条件,这样做也利于类的安全性和封装性,所以要使用属性。
声明属性的语法格式如下:
修饰符 返回类型 属性名
{
get
{
return 需要访问修改的字段;
}
set
{
需要访问修改的字段 = value;
}
}
?修饰符:可以是new、public、protected、internal、private、static、virtual、sealed、override或abstract等,其中static、virtual、override和abstract修饰符不能同时使用。
?返回类型:需要与要修改和访问的字段同类型。
?属性名:不要与字段同名。
当我们使用属性来访问(读)该字段时,就会调用里面的get方法;当我们要修改该字段时,就会调用set方法。
定义一个属性时,可以只写get方法而不写set方法,也可以不写get方法而只写set方法,或者两种方法都不写。
?当只有get方法(get访问器)时,只能访问不能修改。
?当只有set方法时,只能修改不能访问。
?同时具有get方法和set方法时,表示属性的值既能读取又能修改。
其中set方法中有一个名为“value”的隐式参数,此参数的类型是属性类型,如果在该访问器内的局部变量或常量声明中出现该名称,则会导致编译时出错。
除了使用了abstract修饰符的抽象属性,每个访问器的执行体中只有分号“;”,其它所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
二、属性的种类
属性可以分为静态属性和实例属性。
?当属性声明中包含static修饰符时,该属性就称为静态属性。它不与特定实例相关联,因此在静态属性的访问器内引用this会导致编译时错误。
?当属性声明中没有包含static修饰符时,该属性就称为实例属性。它与类的一个给定实例相关联,该实例可以在属性的访问器内用this来访问。
三、访问属性的值示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Program
{
class Person
{
public static int Number; // 公共静态字段,表示人的编号
private static int counter = 0; // 私有静态字段,表示人的编号
private string name; // 私有实例字段,表示人的姓名
private int age; // 私有实例字段,表示人的年龄
public Person()
{
counter = ++counter + Number; // 计算人的编号
}
public string Name// 可读写实例属性Name,用于检索和设置私有字段name
{
get { return name; }
set { name = value; }
}
public int Age // 可读写实例属性Age,用于检索和设置私有字段age
{
get { return age; }
set { age = value; }
}
// 只读静态属性Counter,只包含get访问器,用于检索私有字段counter
public static int Counter
{
get { return counter; }
}
}
static void Main(string[] args)
{
// C#属性-www.baike369.com
Person.Number = 1000;
Person personA = new Person();
personA.Name = "LiPing"; // 为实例属性Name赋值
personA.Age = 18; // 为实例属性Age赋值
Console.WriteLine("Person.number:{0} personA.Name:{1}
personA.Age:{2}", Person.Counter,
personA.Name, personA.Age);
Console.ReadLine();
}
}
}
运行结果:
Person.number:1001 personA.Name:LiPing personA.Age:18