set ; get

前言

OOP  少不了类的实例化、对象属性的赋值操作,在类中,经常可以看到 set ; get 的存在,那么他们的作用是什么呢 ? 写个文档,方便以后失忆了查看。

1,set 的使用

有一个 Person 类,类中有一个 int 型的字段 age。

public class Person
{
     public int age;
}

实例化 Person 得到一个对象后,给该对象里的 age 赋值为 -5,编译是可以通过的,但是年龄为负数,首先不符合常理,其次如果程序其他地方读取了改数值,并且默认按照 age 大于等于 0 的情况进行计算,就很有可能出现错误。

使用 set 就能完美解决这样的问题:

public class Person 
{
     private int _age; //前面加下划线,约定的规范
     public int Age  //首字母大写,约定的规范
     {
         get { return _age; }
         set 
         {
             if (value >= 0) 
             { 
                _age = value;
             }
             else
             {
               _age = 0;
             } 
         }
     }
}

注意上面的代码中,字段的修饰词是 private,属性的修饰词是 public,这样外部只能通过属性访问字段的值。

如果字段的修饰词也是 public,那编译也可以通过,外部就能直接读写字段的值,set ; get 就没有意义了。

2,get 的使用

以上面的 Person 类为例,实例化对象,并有以下代码:

Person p = new Person();
p.Age = -5;               //给年龄属性赋值为-5,但是由于 set 的存在,最终年龄是0
Console.WriteLine(p.Age); //由于 get 的存在,所以可以获取 _age 的值
Console.ReadKey();

如果把 Person 类中的 get { return _age; } 删掉,则 p.Age 就会报错。

所以 get 的作用是限制类中字段的值是否能被读取,不写,或者写返回 null,其他代码就无法直接读取相应数据。

同理不写 set,其他代码就不能给字段赋值。前提条件是字段的修饰词是 private,这个上面说到过。

综上所述

set ; get 的作用就是保护私有字段,允许外部读、写,外部才能读、写,并且还能对读、写操作进行限制、修正,提高了程序的安全性。

对于公有字段,也可以有 set ; get 属性,但是用户可以直接访问字段, set ; get 就不起任何作用了。

发表评论

Powered by WordPress | Theme Revised from Doo

苏ICP备18047621号

Copyright © 2017-2024 追光者博客