C#属性

属性是对现实世界中实例特征的抽象,它提供对类或对象性质的访问。例如人的姓名、年龄、体重和身高等都可以作为属性。类的属性所描述的是状态信息,在类的某个实例中属性的值表示该对象的状态值。

在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}\tpersonA.Name:{1}\t
                    personA.Age:{2}", Person.Counter, 
                    personA.Name, personA.Age);
            Console.ReadLine();
        }
    }
}

运行结果:

Person.number:1001      personA.Name:LiPing      personA.Age:18

posted @ 2015-01-21 16:38  melao2006  阅读(240)  评论(0编辑  收藏  举报