C# get和set

2,667 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

前言

今天这篇文章我们来学习一下关于C#中get和set的知识点的学习,会的大佬可以划走了,哈哈哈,这篇文章很简单,对于我们的初学者还是很友好的,我们知道在面向对象编程(OOP)中,是不允许外界直接对类的成员变量直接访问的,既然不能访问,那定义这些成员变量还有什么意义呢?所以C#中就要用set和get方法来访问私有成员变量,它们相当于外界访问对象的一个通道,一个“接口”。那么今天这篇文章我们一起来学习一下吧,创作不易,大家顺便点点赞吧,你的点赞收藏关注,是我写文章的动力,栓Q啦。

520520.gif

get和set的概念

在面向对象编程里面,有的类的数据是私有的,是封装起来的,所以为了读取写入对应的私有数据,c#采用了关键字get和set,其中get负责读取私有数据set负责写入私有数据,但这两种用法应该并不绝对,我见过在get里面进行写入操作的。我们在学习C#语法的属性时,都要首先和GET,SET访问器打交道,从英文的字面意思上理解,GET应该就是获得什么什么,而SET应该是设置什么什么,那我们看一下,官方是怎么定义这对访问器的:get是读取属性时进行的操作,set是设置属性时进行的操作。定义一个属性如果只有get,这个属性就是只读的。同样,只有set,属性就是只写的,当然只写的属性我觉的意义不是很大。

C# Get和Set.png

简单示例

我们通过实例化实体类,再对实体类的数据进行写入和读取,就要用到GET和SET访问器,我们简单的代码来感受一下吧

class People
{
    private int age;//私有字段

    public int age  //属性
    {
        //GET访问器,可以理解成另类的方法,返回已经被赋了值的私有变量age
        get { return age;  }
        //SET访问器,将我们打入的值赋给私有变量age
        set { age = value; }
    }  
}

我们可以打个生动的比方: age属性就像银行里的自动存取款机,你看不见里面的money,但你能用set(保存年龄),用get(读取年龄)。age是一个私有字段,是分装在类中的,类以外的程序不能直接访问的,类的set和get成员是外部程序访问类内部属性的唯一方法,就像你要得知这个人的年龄,你得去问它,也就是访问这个私有的数据,

class Program
{
     static void Main(string[] args)
     {
        //实例化一个Bank银行
       Peoper peo = new Peoper();

        //对age属性做赋值操作,这时我们访问的是SET访问器
        peo.age = 10;

        //对age属性做取值操作,这时我们访问的是GET访问器
        int a =  peo.age;
     }
}


细心的朋友可以发现当我们设置断点在SET访问的中,执行代码 peo.age = 10;时,就会进入我们属性中的SET访问器了。

以上就是我们的SET和GET访问器的最基本的应用了。

但是我们为什么要用GET和SET访问器呢??
通过GET和SET对公有变量age进行读写操作,实际就是间接更改age私有变量的值,那既然如此。为何不设 peo.age 为public,让实例直接对age进行读写操作呢?我们是不是在多此一举呢?其实,我当初刚接触GET和SET就很理解,并不是说他们的含义难理解,而是为什么要用?为何不直接用个public的字段变量来代替呢? 用了GET和SET能让赋值和取值增加限制

class Bank
{
    private int age;//私有字段

    public int age  //属性
    {
        //GET访问器,可以理解成另类的方法,返回已经被赋了值的私有变量v
        get { return age;  }
        //SET访问器,将我们打入的值赋给私有变量age,并且加了限制,不能存负的
        set
        {
            if (value >= 0)
            {
                age= value;
            }
            else
            {
                age = 0; 
            }
        }
    }        
}

这样的话,我们是永远无法给age属性赋值负的年龄! 其实这种应用才我们的实际的项目中,属性设置中非常常见!例:

 public string ApplyStaff
 {
      //延迟加载ApplyStaff对象
      get
      {
         if (this.IsGhost)
         {
            LazyLoaderFactory.GetLoader().LoadApplicationConfirm(this);
         }
         return applyStaff;
      }
      set
      {
          //判断输入的字符的长度
          if (value.Length > 40)
          {
              throw new Exception("领用人不能超过40个字符。");
          }
          this.applyStaff = value;
      }
 }

 public string BillName
 {
     get
     {
         return billName;
     }
     set
     {
         if (value==string.Empty)
         {
             throw new Exception("单据名称不能为空");
         }
         else if (value.Length > 40)
         {
             throw new Exception("单据名称长度不能超过40个字符");
         }
         else
         {
             this.billName = value;
         }
     }
 }


如果在SET访问器中设置这个属性的一些特性,比如说不能为空,长度大小,必须为数字,各类正则表达式等等,然后抛出异常,表示层再来接受,这样就可以少写很多验证程序了。

总结

这篇文章比较简单,只是简单的学习一下,对它有更多的认识,在有需求的时候最起码有路子,虽然很简单,但是也是可以学到东西的,我们学习了新的知识,对我们的知识储备及技术又有新的一点点的进步,C#的技术就是先简单再难嘛,积少成多之后才会成长才会进步,我们要不断的学习不断的探索,才能有学习的动力,才会有学习的欲望,东西不多,但是实用性挺强建议收藏一下,哈哈哈哈,如果你觉得这篇文章对你有用,点赞最实在,创作不易,点赞评论收藏关注,嘿嘿,不喜勿喷!!!! 202104151629418126.gif