zoukankan      html  css  js  c++  java
  • c#3.0系列:Automatic Property

    之前的做法:
    在c#3.x出来之前,相信大家已经习惯通过一个private field + public property的发式来定义和实现一个public Property。就如下面方式实现。
     1class person
     2    {
     3        private int age;
     4        private string _name;
     5        public int Age
     6        {
     7            get return age; }
     8            set { age = value; }
     9        }

    10        public string Name
    11        {
    12            get return _name; }
    13            set { _name = value; }
    14        }

    15    }
    显然你可以在Property中的set/get代码块中,我们可以不受限制地定义我们的业务逻辑,但是在大多是场合下,我们都是像上面的code一样直接对一个定义的field进行操作:对其读写。但是我们如果根据项目的需要,例如作为Business EntityClass,需要封装非常多的数据,我们需要为不同类型的数据分别定义一个Property,这样不断重复的工作大家一定觉得很厌烦。
    Automatic Property Overview
    在c#3.x出来之后,我们可以通过Automatic Property来简化我们的操作。例如:
     1class Employee
     2    {
     3        //public string Name { get; }  error
     4        public string Name getset; }
     5        public int  Age{getprivate set;}
     6        public Employee(string name,int age )
     7        {
     8            this.Name = name;
     9            this.Age = age;
    10        }

    11    }
    上面的好处我就不用说了。
    Automatic Property IN CLR
    首先让我们看看c#3.x出来之前和出来之后,编译器是怎么处理的:

    大家可以看到,C#3.x仅仅是基于.NET Programming Language,而不是基于.NET Framework的。加了一些必要的code,使原本我们看起来显得残缺的code(比如缺少对Property 的实现)变得完整。在运行的时候,这些code和原来的code是完全一样的。Automatic Property代码里多处了两个域<Age>k_BackingField和<Name>k_BackingField,他们的作用就是:他们分别对应着两个PropertyAgeName),其作用和person中定义的两个FieldAgeName)完全一样。代码如下:
    internal class Employee
    {
        
    // Fields
        [CompilerGenerated]
        
    private int <Age>k__BackingField;
        [CompilerGenerated]
        
    private string <Name>k__BackingField;

        
    // Methods
        public Employee(string name, int age);

        
    // Properties
        public int Age {  getprivate set; }
        
    public string Name get;  set; }
    }


     
    Quiz for Automatic Property
    注意与抽象属性的区别
    abstract class people
        
    {
            
    public abstract string Name getset; }
            
    public abstract int Age getset; }
        }

    不能定义只读或者只写的属性,必须同时提供
    请看上面Employee。第一行,编译器会报错。

    可以给读和写赋予不同的访问权限
    请看上面Employee。Age属性,请注意他的操作权限。

    自动属性的初始化
    动属性会为字段自动赋予变量类型的初始值,如果是引用类型,则为null,如果你想初始化,必须要在
    自定义的构造函数初始化。请看上面Employee

    不适用的情况
    果想在属性中增加判断、验证等逻辑,则只能用传统的属性定义方法实现 如下:
     1public int Age 
     2
     3   get return age; } 
     4   set 
     5   
     6     if ((value > 0&& (value < 500)) 
     7     
     8       age = value; 
     9     }
     
    10     else 
    11     
    12        throw new ArgumentOutOfRangeException  ("你不是人!"); 
    13     }
     
    14   }

    15}
     
    16




    版权所有归"布衣软件工作者".未经容许不得转载.
  • 相关阅读:
    ASP.NET中自定义控件无法响应事件的问题
    通过编程为ASP.NET页面设置缓存
    VB.NET中Module的概念
    IDENTITY列及其编号的问题
    使用XML RPC进行远程调用
    存储过程编写和优化的经验
    为控件添加设计期支持
    SSIS的一个问题
    多线程编程中的锁定(lock,Monitor)
    汉字的奥秘: 获取汉字的笔画数
  • 原文地址:https://www.cnblogs.com/gjcn/p/1146387.html
Copyright © 2011-2022 走看看