• 属性(Properties)和字段在C#中的关系


      主题:这篇文章我来说下属性(Properties)和字段在C#中的关系。首先申明一下,这里讲的属性就是通常说的包含get,或者是set访问器的属性,不是属性 (Attribute)。我们写程序的时候大多都会用到实体类,而生成实体类,我们都会申明一些常规属性或者是自动实现的属性。至于到底选用哪一种属性,或者说是否可以直接用字段代替呢?

          常规属性(带有私有字段)和自动实现属性的区别:


           一个完整的常规属性由以下几部分构成:
          1:私有字段,用来存储变量(后备存储),这个字段之所以是私有的,是为了让它只能通过属性来赋值。

    private string _sName;

         

          2:一个get访问器,它负责读取数据,用于返回字段值或者是用于计算并返回字段值。以return或者是throw语句终止。其中可以包含些简单的逻辑处理,例如数据验证等等。
                

                get
                 {
                    
    //电脑价格,如果小于零,则返回0,说明数据不正常
                    return _computerPrice >= 0 ? _computerPrice : 0;
                 }

          

              说明:get访问器是读取数据,所有不要在代码块中修改属性状态。下面的代码是不被推荐的。

    private string _sName;
    public string sName
    {
      
    get
       {
    return (_sName+"");}
    }

          

           3:一个set访问器,负责给属性赋值,类似于一个返回类型为void的方法,可以包含逻辑处理,例如可以根据默认的值通过计算后返回结果。


            常规属性分类:


            1:按访问修饰符来分:可将属性标记为 public、private、protected、internal 或 protected internal。这些访问修饰符定义类的用户如何才能访问属性。
            2:属性还可以标记成,静态属性,实例属性,虚属性,抽象属性,需要注意的是,如果属性已经标记成静态(static ) 的,那么后面不能和虚(virtual),抽象(abstract),重写(override)混用。
            3:同一属性如果只包含get访问器,我们称之为只读属性,如果只包含set访问器,叫可写属性,如果即有get, 又有set访问器,我们叫可读可写属性。


            什么是自动实现的属性?
            当属性访问器中不需要其他逻辑时,自动实现的属性可使属性声明变得更加简洁。当您如下面的示例所示声明属性时,编译器将创建一个私有的匿名后备字段,该字段只能通过属性的 get 和 set 访问器进行访问。
            

            public string sName
             {
                
    get;
                
    set;
             }

        

            自动实现属性和常规属性的区别:


             1:自动实现的属性必须同时声明 get 和 set 访问器。若要创建 readonly 自动实现属性,请给予它 private set 访问器。

            2:自动实现的属性 (Property) 不允许具有属性 (Attribute)。如果您必须在属性 (Property) 的后备字段上使用属性 (Attribute),则应该只创建常规属性 (Property)。
           3:从自动实现属性的定义来看,可以发现在get,和set中不能包含特殊的逻辑处理。这点从功能上讲有点类似字段的作用,但和字段又有区别。

            什么是字段,这里不用多说,这里讲下字段和属性的区别:
           1:字段在值的处理上并不是那么的灵活,给它赋什么它就是什么,不允许经过逻辑处理。如果把一个人的身高写成一个字段,给它赋值1000M,这显示是不正常的数据,字段无法处理这种特殊数据。
            2:与字段不同,属性不作为变量来分类。因此,不能将属性作为 ref参数或 out参数传递。下面的写法都是错误的:

    class studentProperties3
         {
            
    public string sName
             {
                
    get;
                
    set;
             }
         }
    private static void   refName(ref string   sName)
             {
                 sName
    = sName+"ref";
             }
            
    private static void   outName(string sName, out string sName2)
             {
                 sName2
    = sName+"out";
                
             }
    studentProperties3 s3
    = new studentProperties3();
                 s3.sName
    = "王五";
                 sName
    = s3.sName;
              
                 refName(
    ref s3 .sName );//错误
                 outName(sName,out sName);//错误

        

           常规属性,自动实现属性和字段都各有特点:

           1:常规属性功能最全,灵活必也最强。

                案例:项目开发中,有时会发现两个系统之间的某些类中属性有部分相同有部分不同,调用时需要把一个类的相关属性赋值给另一个类的相同属性,如果属性的数目较少,我们可以一个一个手工来写,但如果较多,或者属性里面中包含复杂属性,我想这是比较烦人的事,有了属性就会变得更加简洁。

               //转换公共属性
                 PropertyInfo[] proAs = s3.GetType().GetProperties();
                 PropertyInfo[] proBs
    = s4.GetType().GetProperties();
                
    if (proAs != null && proAs.Length > 0 && proBs != null && proBs.Length > 0)
                 {
                    
    foreach (PropertyInfo proA in proAs)
                     {
                        
    if (!proA.CanRead) continue;

                        
    foreach (PropertyInfo proB in proBs)
                         {
                            
    if (proB.Name.ToLower() == proA.Name.ToLower() &&
                                 proB.PropertyType
    == proA.PropertyType &&
                                 proB.CanWrite)
                             {
                                 proB.SetValue(s4, proA.GetValue(s3,
    null), null);
                             }
                         }
                     }
                 }

        

            2:自动实现属性较常规属性代码简洁,但灵活性不够(get,set访问器中不能包含逻辑代码)。在数据的存储和读取上功能和字段相同。
            3:字段,代码最少,但灵活性最差。如果字段在赋值和取值时并无逻辑处理,可以选择字段。字段结合方法的使用可以和常规属性功能相比。

  • 相关阅读:
    SQL SERVER没有足够的内存继续执行程序 (MSCORLIB)的解决办法
    Python之数据分析
    python之爬虫
    Linux从入门到放弃(为做一个开发+运维的全能性人才而奋斗)
    从零开始学python
    VUE学习
    Python进阶
    MySQL系列
    python基础其他
    Microsoft Office 2010/2013安装组件预设
  • 原文地址:https://www.cnblogs.com/mahaisong/p/2098350.html
Copyright © 2020-2023  润新知