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




posted on 2008-04-10 11:06 gjcn 阅读(2006) 评论(14)  编辑 收藏 所属分类: Net Framework

评论

#1楼  2008-04-10 11:23 生鱼片      

在学习一遍   回复  引用  查看    

#2楼 [楼主] 2008-04-10 11:27 gjcn      

@生鱼片
前段时间没空,还没有学习3.5,最近才开始,看来我落后了。   回复  引用  查看    

#3楼  2008-04-10 11:34 巫云      

抛出的异常很帅:你不是人!   回复  引用  查看    

#4楼  2008-04-10 11:34 zzzz [未注册用户]

使用传统方法也挺简单啊,定一个private field 有快捷功能自动生成 public property   回复  引用  查看    

#5楼 [楼主] 2008-04-10 11:36 gjcn      

@zzzz
对啊,有这个功能,但是我还是不喜欢,有点
Business Entity的Class的字段是很多的。   回复  引用  查看    

#6楼  2008-04-10 11:36 iori--------- [未注册用户]

顶,收藏!学习!   回复  引用  查看    

#7楼  2008-04-10 11:50 白发先生      

不错,温故而知新   回复  引用  查看    

#8楼  2008-04-10 12:39 杨连国      

不错,我以前就为重复定义这个问题挠头,不知道微软的全角问题解决了没有。   回复  引用  查看    

#9楼  2008-04-10 12:53 Kerry Jiang [未注册用户]

老大, 是C# 3.5好不好   回复  引用  查看    

#10楼  2008-04-10 14:10 BlueMountain      

那个啥, 俄 这个 就是
class
{
private string name=string.Empty;
public string Name
{
get...
set...
}
}

他没有办法让我的name 默认一个default,很郁闷。   回复  引用  查看    

#11楼  2008-04-10 14:17 BlueMountain      

额 或许这个默认的string.Empty;应该在构造函数里面定义


class TestA
{
public string Name { get; set; }
public int Age { get; private set; }
public TestA()
{
Name = string.Empty;
}
}

像这个样子, 顺便问一下lz ,怎么你的代码可以格式化,而是可以折叠,我的怎么就没有啊?   回复  引用  查看    

#12楼  2008-04-10 15:00 hahahehe [未注册用户]

@BlueMountain
用高级评论,点击上面的code按钮就可以了   回复  引用  查看    

#13楼  2008-04-10 22:15 macless [未注册用户]

现在还是在使用.net2.0的阶段呢,落后了哦。   回复  引用  查看    

#14楼  2008-04-12 18:46 lbq1221119      

不错不错,呵呵
能感觉到进步大大的。   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印
最新IT新闻:
· 微软副总裁公开承认Vista存在问题
· 互联网DNS存在重大漏洞 黑客可能控制网络流量
· Opera提出网络标准课程 发布标准教育倡议
· SubSonic 2.1 版本发布
· 语义搜索领跑后google搜索引擎
 


导航

公告

These postings are provided "AS IS" with no warranties, and confer no rights.
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

与我联系

常用链接

留言簿(2)

我参与的团队

随笔分类

随笔档案

文章分类

友情BLOG

搜索

最新评论

阅读排行榜

评论排行榜