C#中字段和属性区别

前言
在学习C#编程过程中绕不过字段和属性这两个概念,这也是面向对象编程必不可少的元素,本文主要谈谈博主对它们的一些拙见,仅代表个人观点。
正文
先上图:

//定义了一个名为studentName的字段
private string studentName;
//定义了一个名为StudentName的属性
public string StudentName { get; set; }

从上图我们就可以基本看出字段和属性在定义上的区别,即属性增加了get和set访问器。一般来说字段的作用是为了对内封装数据,而属性的作用则是对外一种状态的展示。我们从微软的MSDN文档就可以看出一个官方的类向外提供了构造函数、属性、方法、事件等,而我们却看不到字段。我们也无法通过新建类的实例去索引到字段。这是因为字段一般被设置为private,即仅供类的内部封装数据使用,外界没有权限去读写它,这也是我开头提到的“对内”这一概念。而属性实际是不封装数据的,仅仅是为了外界能够知晓类当前的某一状态信息,这就是我开头提到的"对外"这一概念。可能小伙伴看到这里还是不太明白,接下来我用代码来释义。

关键点

//定义了一个名为studentName的字段
private string studentName;
//定义了一个名为StudentName的属性
public string StudentName
{
   get
   {
      return studentName;
   }
   set 
   {
      studentName = value;            
   }        
 }

上图便是我们对属性最常规的用法, 通过以上定义我们可以知道StudentName这个属性可读可写,当我们获取StudentName的值时,给我们提供的是字段studentName的值,同理设置StudentName时,将值赋给了字段studentName。肯定有人在这时会问为什么不直接去操作字段studentName,为何要通过属性去间接去操作。我们不妨试想一下,如果我们将字段studentName暴露给外界使用时,如果使用者设置了一个非法值,那程序的执行结果可能会超出我们的预期,变得不可控,这是我们不想看到的,因此set访问器的作用就体现出来了,可以在其中设置一些限制条件,过滤掉非法值。虽然我们在程序中也可以给字段设置限制条件,过滤掉非法值,但是程序的可读性会变差,而属性就能很好的实现这一功能。并且属性也是面向对象编程中抽象出来的非常重要的一个概念,它反映了我们客观世界某一事物的状态、特征等等,比如鸟类的飞行速度,这就是它们的速度属性,不同品种的鸟,飞行速度不同,这就导致了属性值的不同,这是客观存在的。我们外界就可以通过调用鸟的飞行速度这一属性去判断那个品种的鸟飞的快,那个品种的鸟飞的慢,这就是属性要告诉我们调用者的信息。而且鸟的飞行速度这一属性是由其自身决定的,我们外界调用者只能去get它的值,而不能去set它的值,那我们就把它可以设置为只读属性。

接下来我在补充一个小知识:

//定义了一个名为StudentName的属性
public string StudentName { get; set; }

上图是自动实现的属性,虽然我们没有在get和set访问器中写具体代码,但是c#其实已经帮我们自动实现了和下图等效的代码块,注意是等效

get
{
    return studentName;
}
set 
{
    studentName = value;            
}        

结语
说到这,博主关于字段和属性的看法也就介绍完成了,以上信息仅代表个人观点,读者有更好的想法可以一起在评论区交流讨论。

你可能感兴趣的:(c#,开发语言)