博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 属性(Property)和字段(Field)的区别
阅读量:5944 次
发布时间:2019-06-19

本文共 1761 字,大约阅读时间需要 5 分钟。

导读:

     近期学习过程中发现了一些问题,我的学习只是学习,敲代码就是敲代码,没有加入思考,也不问为什么就直接去敲人家写好的例子去敲,把知识都学死了,逐渐散失了思考能力,所以学习的兴趣大打折扣,正如那句话—学而不思则罔,思而不学则殆,在设计模式中偶然看到了属性和字段,想想之前的C#中也提到过,但是从来没有思索过为什么有属性和字段?下面就来详细说明。

【字段】

     字段(Field)是一种表示与对象或类关联的变量的成员,字段声明用于引入一个或多个给定类型的字段。字段是类内部用的,private类型的变量(字段),通常字段写法都是加个"_"符号,然后声明只读属性,字段用来储存数据。

【属性】

    属性(Property)是另一种类型的类成员,定义属性的目的是在于便于一些私有字段的访问。类提供给外部调用时用的可以设置或读取一个值,属性则是对字段的封装,将字段和访问自己字段的方法组合在一起,提供灵活的机制来读取、编写或计算私有字段的值。属性有自己的名称,并且包含get 访问器和set 访问器。

  声明格式:

 

属性修饰符  类型  属性名 {   get{     //get访问器代码    }   set{     //set访问器代码    }}

 

   属性分类:根据get访问器和set访问器是否存在,属性可按下列规则分类。

 

      

那么问题来了,既然已经有字段用来存储数据,为什么还要引入属性来对数据进行访问,把声明的字段直接定义成公有的不就可以了吗?

解答:在C#中,我们可以非常自由的、毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作。在两个块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。当缺少其中一块时属性就只能读或只能写,set和get块中属性必需有一个,因为即不能读又不能写的属性是没有意义的。总之,外部能够访问和修改定义为public的字段,这么做是违反类的安全性设计原则的,所以一般的字段都是设为私有的,字段的访问便是由属性来实现。

C#通过属性特性读取和写入字段(成员变量),而不直接直接读取和写入,以此来提供对类中字段的保护。

【属性VS字段】

      

  

【适用情况】

      公共字段:

           1. 允许自由读写

           2. 取值范围只收数据类型约束而无其他任何特定限制;

           3. 值的变动不需要引发类中其它任何成员的相应变化;

         如果均满足上述条件,那么我们便可以大胆地使用公共字段;

       属性:

             1. 要求字段只能读或只能写;

             2. 需要限定字段的取值范围;

             3. 在改变一个字段的值的时候希望改变对象的其它一些状态;

           如果满足上述条件中的任何一个,就应该使用属性。

 【代码展示】

pulic class User{    private string _name;//_name为字段    public string Name   //Name为属性,它含有代码块     {       get       {          return _name;//读取(返回_name值)        }       set        {          _name = value;//为_name赋值        }}

 

 

 

           User类的私有的字段m_name可以通过公开的属性Name对它进行读写操作。 通过“属性”读取“字段”值时,将触发get访问器;通过“属性”为“字段”赋值,将触发set访问器。

 

【总结】

 

     属性以灵活的方式实现了对私有字段的访问,是字段的自然扩展,一个属性总是与某个字段相关联,字段能干的,属性一定能干,属性能干的,字段不一定干的了;为了实现对字段的封装,保证字段的安全性,产生了属性,其本质是方法,暴露在外,可以对私有字段进行读写,以此提供对类中字段的保护,字段中存储数据更安全。

  

尾言:

      无论是属性还是字段都有它存在的意义,需求多种多样,就产生多种多样的对策,属性和字段算是C#中的基础知识,掌握好基础知识,建造的高楼大厦才更好的扎实稳固。

你可能感兴趣的文章
godaddy域名转发(域名跳转)设置教程
查看>>
silverlight学习布局之:布局stackpanel
查看>>
理解并自定义HttpHandler
查看>>
从前后端分离到GraphQL,携程如何用Node实现?\n
查看>>
JavaScript标准库系列——RegExp对象(三)
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
关于缓存命中率的几个关键问题!
查看>>
oracle中create table with as和insert into with as语句
查看>>
kafka连接异常
查看>>
11g废弃的Hint - BYPASS_UJVC
查看>>
为什么工业控制系统需要安全防护?
查看>>
Mongodb部署记录[3]-主从搭建
查看>>
hive sql操作
查看>>
tomcat 深度优化
查看>>
127 - "Accordian" Patience
查看>>
Mac 常用快捷键
查看>>
阿里云CentOS7安装Oracle11GR2
查看>>
nginc+memcache
查看>>
php正则匹配utf-8编码的中文汉字
查看>>
MemCache在Windows环境下的搭建及启动
查看>>