• 字段和属性的理解


    在get和set访问器中都加入了条件,并且是我手动书写的,VS给我们提供了一个自动封装字段的方法,下面我们来按照我说的步骤来试一下,在类中定义一个字段 string a="我是A"; 接着把鼠标停放到a处,点击右键“重构”--“封装字段”,VS会自动的封装a字段,并且取名为A,你也可以更改属性的名字,点击确定,a字段的A属性就封装好了,封装后的代码为:

           string a = "我是A";

            public string A
            {
                get { return a; }
                set { a = value; }
            }

          通常我们都习惯叫get访问器和set访问器,如果我们想得到类中的属性值时,用到的是get访问器return返回出值,如果我们想给属性赋值的时候,就会用到set访问器,属性有4种形式:分别是可读可写属性,既有get也有set访问器;如果只有get访问器,这个属性是只读的,无法赋值;如果只有set访问器,这个属性就只能被赋值,不能读取,以后我们要学习界面设计时,所有的控件都有很多的属性,这些属性就都是只写的,并且有一定的赋值要求,比如在网页上画一个表格,我们设置表格的边框颜色,就使用到边框颜色的属性,如果我们赋的颜色值不符合规范,就会出现错误提示;还有一种属性是加入了static关键字的静态属性,静态属性只能封装静态数据,比如:string static a = "我是静态A";

            public  static string A
            {
                get { return a; }
                set { a = value; }
            }

           下面我们把上面的例子继续深化,声明一个对象boby,我们来具体看一下如果利用属性的读写功能:


     1   class Ren
     2    {
     3        //先定义一个私有变量实际年龄age
     4        int age = 10;
     5
     6        //再定义一个属性,
     7        public int Age
     8        {
     9            //输出时的年龄比实际年龄age大三岁,即输出的是10+3岁
    10            get { return age + 3; }
    11            //给年龄赋值时,先判断年龄的范围
    12            set 
    13            {
    14                //如果年龄小于1岁或是大于120岁时,不允许赋值,提示错误。
    15                if (value < 1 || value > 120)
    16                    Console.WriteLine("您输入的年龄有误");
    17                 //如果年龄符合范围,允许赋值,赋完值后的age即是value你赋的值。
    18                else
    19                    age = value;
    20            
    21            }
    22        }
    23        //定义一个得到真实年龄的方法
    24        public void realage()
    25        {
    26            Console.WriteLine("真实年龄为" + age + "岁");
    27        }
    28    }
    29    class Program
    30    {
    31
    32        static void Main(string[] args)
    33        {
    34            //实例化一个人Ren类aboy孩子对象
    35            Ren aboy = new Ren();
    36           
    37            //此时打印出的是,未通过属性直接用到的age初值,也就是真实年龄。
    38            aboy.realage();
    39            Console.WriteLine();
    40
    41            //现在我们直接取得孩子的年龄,因为age是私有变量,我们必须通过属性Age得到,值为虚假的大三岁的年龄
    42            Console.WriteLine("通过属性得到的年龄为:"+aboy .Age);
    43            Console.WriteLine();
    44
    45            //现在我们给孩子的年龄赋一个0岁的值,因为age是私有变量,同样赋值也是通过属性Age,
    46            //此时由于年龄范围的限制,是会报错的。
    47            aboy.Age = 0;
    48
    49            //我们再给孩子的年龄赋一个12岁,因为age是私有变量,同样赋值也是通过属性Age
    50            aboy.Age = 12;
    51            Console.WriteLine();
    52
    53            //此时因为年龄的范围合法,原来的age=10,便被替换成了12。
    54            //我们再来打印孩子的真实年龄
    55            aboy.realage();
    56            Console.WriteLine();
    57            //我们再来打印一下age改为12后的虚假年龄Age
    58            Console.WriteLine("通过属性得到的年龄为:" + aboy.Age);
    59            Console.WriteLine();
    60
    61        }
    62    }

     我们来看一下运行的结果:

    真实年龄为10岁

    通过属性得到的年龄为:13

    您输入的年龄有误

    真实年龄为12岁

    通过属性得到的年龄为:15

       通过这个实例相信大家已经了解了属性的用法,下面我们把我上节课有关军种的实例做一下改动,同学们再来体会一下属性的用法:

    优化军种属性

    运行结果为

    不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军
    赋值后的军种为:

    战略空军将使战争形态向可控战争转变。

    赋值后的军种为:空军
    请按任意键继续. . .

    对比我上节课用的普通方法即(被我注释掉的)代码如下:

      


     1class Armyman
     2    {
     3        public string Armytype = "";
     4        public void ArmyFunction()
     5        {
     6            switch (Armytype)
     7            {
     8                case "陆军":
     9                    Console.WriteLine("现代陆军都是大规模的机械化部队,拥有大量的重装备和后勤补给。");
    10                    break;
    11                case "海军":
    12                    Console.WriteLine("杜鲁门曾说过:海军到哪里,国家的权利就到哪里 .");
    13                    break;
    14                case "空军":
    15                    Console.WriteLine("战略空军将使战争形态向可控战争转变。");
    16                    break;
    17                default:
    18                    Console.WriteLine("{0}不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军", Armytype);
    19                    break;
    20            }
    21        }
    22        //下面的代码实现了和上面一下的功能,先定义一个私有的字段Armytype,再定义一个属性
    23            //string Armytype = "";
    24            // public string Armytype1
    25            //{
    26            //    get {
    27            //        return Armytype;
    28
    29            //    }
    30            //    set
    31            //    {
    32            //        switch (value)
    33            //        {
    34            //            case "陆军":
    35            //                Console.WriteLine("现代陆军都是大规模的机械化部队,拥有大量的重装备和后勤补给。");
    36            //                Armytype = value;
    37            //                break;
    38            //            case "海军":
    39            //                Console.WriteLine("杜鲁门曾说过:海军到哪里,国家的权利就到哪里 .");
    40            //                Armytype = value;
    41            //                break;
    42            //            case "空军":
    43            //                Console.WriteLine("战略空军将使战争形态向可控战争转变。");
    44            //                Armytype = value;
    45            //                break;
    46            //            default:
    47            //                Console.WriteLine("{0}不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军", Armytype);
    48            //                break;
    49            //        }
    50            //    }
    51            //}
    52
    53        }
    54    class Program
    55    {
    56
    57        static void Main(string[] args)
    58        {
    59            //我们来创建一个军人类Armyman 的实例对象ASoldiers(士兵)
    60            Armyman ASoldiers = new Armyman();
    61
    62            ////当赋值除海军、陆军、空军时,出现错误提示
    63            //ASoldiers.Armytype1 = "男性";
    64            ////因为有属性赋值时的判断,所以此时属性Armytype1还是原来Armytype字段的初值:空
    65            //Console.WriteLine("赋值后的军种为:" + ASoldiers.Armytype1);
    66            //Console.WriteLine();
    67
    68            ////当正常赋值时,得到正确的结果。
    69            //ASoldiers.Armytype1 = "空军";
    70            //Console.WriteLine();
    71            ////因为有属性赋值时的判断,所以此时属性Armytype1是已经赋的“空军”
    72            //Console.WriteLine("赋值后的军种为:" + ASoldiers.Armytype1);
    73
    74
    75            //给字段Armytype赋值为“男性”
    76            ASoldiers.Armytype = "男性";
    77            //可以通过这个方法告知男性不符合赋值规则,输出提示
    78            ASoldiers.ArmyFunction();
    79            //但此时,“男性”这个值已经赋给了Armytype字段,这是错误的做法。
    80            Console.WriteLine(ASoldiers.Armytype);
    81
    82        }
    83    }
    84        }

    运行结果如下:

    男性不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军
    男性
    请按任意键继续. . .

         从结果来看,很明显,如果用上面的例子,男性这个军种如果不采用属性,而是用被我注释掉的方法(第3行)一定会被赋值给Armytype字段的,而使用了属性时,“男性”因为进入了default代码快如46-48行,我们没有加入Armytype=value;这句代码,使得无法对字段Armytype赋值,这时代码第65行,Armytype1的值仍然为空,而不是“男性”,属性的优点就体现在这,所以我在前面的课程中曾说属性是保护字段的。

            本节课我们就讲到这,下节课我们来学习方法的参数类型.

  • 相关阅读:
    Linux下g++编译与使用静态库和动态库(仅命令)
    Shell算数运算
    (转载)解决/usr/bin/ld: cannot find -lxxx 问题
    (转)C语言中的EOF和feof()
    204 Count Primes
    228 Summary Range
    235 Lowest Common Ancestor of a Binary Search Tree
    242 Valid Anagram
    简易计算器实现优化
    原生JS操作cookie
  • 原文地址:https://www.cnblogs.com/yanyao/p/5827908.html
Copyright © 2020-2023  润新知