自学.NET之路-属性,索引器

轉自:http://www.cnblogs.com/smile2008/articles/1217567.html

class Test
{
     private static string _name;
     private static string _id;
     static void Main()
     {
      _name=Console.ReadLine();     //接受用户输入
      _id=Console.ReadLine();
     }
}

虽然以上代码可以正常工作,但公开类的数据成员通常认为是一个不好的编程做法。因为用户为字段_id输入的值在赋值之前没有经过必要的验证,所以用户可以输入任何值而不受限制。

这是我们不想看到的,所以C#提供‘属性’来对类中字段提供保护。

[访问修饰符] 数据类型 属性名       //读,写属性
{
     get{};
     set{};
}


    class Test
    {
        private int _age=20;      //还记得命名规范,成员变量前加前缀 _ 吗?。注意如果初始值未赋值将输出默认值0

        public int Age                //属性名应该为帕斯卡命名法,表示它返回的实体
        {
            get                          //读/属性
            {
                return _age;
            }

            set                          //写/属性
            {
                if (value < 18)                        //value为传进去的值
                {
                    Console.WriteLine("年纪太小");
                }
                else
                {
                    _age = value;
                }
            }
        }
        static void Main()
        {
            Test obj = new Test();
            Console.WriteLine(obj.Age);    //直接读取Age 返回_age.返回初始值。注意如果初始值未赋值将输出默认值0
            obj.Age = 12;                           //往Age内写值,小于18输出:年纪太小。
            obj.Age = 25;                           //往Age内写值,大于18,赋值成功。
            Console.WriteLine(obj.Age);      //赋值成功后,覆盖初始值,输出新值。
        }

    }

控制台输出:
20
年纪太小
25

[访问修饰符] 数据类型 属性名       //只读属性
{
 get{};

}

    class Test
    {
        private int _age;   //注意如果初始值未赋值将输出默认值0     _age=10 控制台输出 10 
        public int Age    
        {
            get                     //读/属性
            {
                return _age;
            }

        }
        static void Main()
        {
            Test obj = new Test();
            Console.WriteLine(obj.Age); //直接读取Age 返回_age.返回初始值。注意如果初始值未赋值将输出默认值0
        }
    }

控制台输出:
0

[访问修饰符] 数据类型 属性名  //无意义的只写属性
{
 set{}; //写属性
}

只写属性是没有任何意义的。.NET类库设计指南明确地指出:“不要使用只写属性”。

但是我们遇到类字段过多怎么办呢?自己手写,比较耗时。编译器提供了一种快捷封装字段的功能。
选中要封装的字段名,反键-重构-封装字段-确定即可。
在SharpDevelop中選中類字段,單擊右鍵,彈出的菜單中有一個建立屬性,程序會自動幫你建好.





索引器

索引器允许按照数组的方式检索对象的数组元素。正如属性可以使用户像访问字段一样访问对象的数据,索引器可以使用户像访问数组一样访问类成员。这就是索引的用处。
必须注意的是,仅有一个元素时没必要使用索引器进行检索,使用索引一般都是针对类的数组元素。

[访问修饰符] 数据类型 this [数据类型 标识符]
{
 get{};
 set{};
}

 

    class Car           //定义一个汽车
    {
        string[] wheels = new string[4];         //定义车有四个轮子

        public Car()             //构造函数内赋值
        {
            wheels[0] = "左前轮";
            wheels[1] = "右前轮";
            wheels[2] = "左后轮";
            wheels[3] = "右后轮";
        }

     // Car类的索引器 string为返回值的数据类型,this在这里作用索引器的名称,而且必须用this
     // int为接受值的数据类型,index为标识符

        public string this[int index] 
        {
            get
            {
                return wheels[index];
            }
            set
            {
                wheels[index] = value;
            }
        }
    }

    class test              //定义一个测试类
    {
        public static void Main(String[] args)
        {
            Car car1 = new Car();           //实例化Car类

            Console.WriteLine("car1的第一个轮子是:{0}", car1[0]);      //wheels[0] = "左前轮";
            Console.WriteLine("car1的第三个轮子是:{0}", car1[2]);      //wheels[2] = "左后轮";

            car1[1] = "新的右前轮";         //更新初始值
            car1[3] = "新的右后轮";

            Console.WriteLine("car1的第二个轮子是:{0}", car1[1]);          //输出新值
            Console.WriteLine("car1的第四个轮子是:{0}", car1[3]);
        }
    }


控制台输出:
car1的第一个轮子是:左前轮
car1的第三个轮子是:左后轮
car1的第二个轮子是:新的右前轮
car1的第四个轮子是:新的右后轮

posted @ 2008-09-02 00:01  Athrun  阅读(305)  评论(0编辑  收藏  举报