C#3.0 为我们带来什么(2) —— 自动属性

public int ID { get; protected set; }
        public string Name { get; set; }
这是接口内声明的属性么?
no,这也可以是类的属性,自动属性。
如果说c#3.0最大的改变是什么,那就是编码方式更人性化,程序员可以变的更懒。自动属性也是这一特征的具体表现。
对比两段代码
C# 2.0

    public class a
    {
        private int _id;
        private string _name;
        public int ID
        {
            get
            {
                return _id;
            }

            protected set
            {
                _id = value;
            }
        }

        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }
        public a(int id)
        {
            this._id = id;
        }
    }

C# 3.0

    public class b
    {
        public int ID { get; protected set; }
        public string Name { get; set; }
        public b(int id)
        {
            this.ID = id;
        }
    }

在c#中是推荐使用属性来代替public 变量的。我们在项目中也尽量将需要公开的字段定义为属性,代之而来的就是上面代码的冗繁。不管你对这个属性有没有特殊处理,都需要先定义一个私有变量,并将其在get,set方法中返回或赋值。使得代码量大量增加,阅读难度也增加。
随3.0而来的自动属性使我们可以方便的定义一个简单属性(不需要对field进行特殊处理的),他所使用的私有变量由系统来生成。工作量减少,阅读难度降低。

下面来看看编译器到底为我们做了什么。
使用IL Disassembler来看看到底发生了什么。

可以看到除了私有变量的地方不同外其它的都是一样的。
看看这俩变量的定义有什么不同。
c# 2.0
.field private int32 _id
c# 3.0:
.field private int32 '<ID>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
反射?
msdn对CompilerGeneratedAttribute是这样描述的。
Distinguishes a compiler-generated element from a user-generated element. This class cannot be inherited.
区分编译器生成的元素与用户生成的元素。无法继承此类。
其意思就是上面两端IL代码没什么不同,不过是第二个里的私有变量标记了是编译器生成的而已。
再来看看两个个set_Name
c#2.0
.method public hidebysig specialname instance void
        set_Name(string 'value') cil managed
{
  // 代码大小       9 (0x9)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldarg.1
  IL_0003:  stfld      string WindowsFormsApplication1.a::_name
  IL_0008:  ret
} // end of method a::set_Name

c#3.0:
.method public hidebysig specialname instance void
        set_Name(string 'value') cil managed
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
  // 代码大小       8 (0x8)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  stfld      string WindowsFormsApplication1.b::'<Name>k__BackingField'
  IL_0007:  ret
} // end of method b::set_Name

不同也不过是多了一句话
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )

好了现在放心了,大胆使用吧。

自动属性最终带给我们的应该是两种方式交融的编码方式

    public class b
    {
        private int _age;
        public int ID { get; protected set; }
        public string Name { get; set; }
        public int Age
        {
            get
            {
                return _age;
            }
            set
            {
                if (value < 0 || value > 120)
                    new Exception("年龄超出范围。");
                else
                    _age = value;
            }
        }
        public b(int id)
        {
            this.ID = id;
        }
    }

(小弟才疏学浅,欢迎各位看客指正错误。)

posted on 2008-01-06 16:37 tianyamoon 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/tianyamoon/archive/2008/01/06/1027913.html

C#3.0 为我们带来什么(2) —— 自动属性相关推荐

  1. ASP3.0给我们带来的新技术之一---DataShaping技术

    ASP3.0给我们带来的新技术之一---Data Shaping技术 Data shaping(又可以被称为分层记录集) 如果你对ACCESS非常熟悉的话,它就类似与其中的子表.在你使用VB 进行数据 ...

  2. C#3.0 为我们带来什么(5) —— 匿名类型

    C#3.0 为我们带来什么(5) -- 匿名类型 var employee= new{Age =25,Name = "james" } 无须显示声明一个类,而且在初始化器里面可以获 ...

  3. C#3.0 为我们带来什么(3) —— 初始化器

    C#3.0 为我们带来什么(3) -- 初始化器 对比代码 c#2.0         Employee e1;         private void ee1()         {        ...

  4. C#学习笔记四: C#3.0自动属性匿名属性及扩展方法

    前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...

  5. C#3.0 自动属性——只能在简单属性上偷懒

    C# 3.0 为了提高开发效率和改善编程体验,提供了自动属性的功能,具体的代码则由编译器完成.这样一来声明类中的属性和在接口中声明属性简直就无法区分出来.  但是,在体验中发现我们只能对string, ...

  6. Asp.Net4.0/VS2010新变化(2):网站自动预热

    往往我们会有一些web应用,在网站初次被访问时要做一些初始化处理,比如加载数据到缓存中之类. 如果某个用户正好不幸成为第一个访客,他可能会觉得网站速度很慢,现在好了,asp.net 4.0 IIS7. ...

  7. asp.net 2.0中,新增加了validationgroup属性

    asp.net 1.1中,对于验证类控件,在使用时,遇到有的不需要验证的控件时,是十分麻烦的,就是说不可能有选择验证某些控件. 而在asp.net 2.0中,新增加了validationgroup属性 ...

  8. 如何提升鸿蒙战绩,蛰伏一年 鸿蒙系统2.0为我们带来了哪些升级?

    去年的华为开发者大会上,我们看到了当时在网络上流传已久的HarmonyOS,鸿蒙系统.在随后的一年之中,鸿蒙系统在智慧屏上生根发芽,不断完善自身生态,让人觉得它异常低调.暂时的蛰伏只是为了能够更好地进 ...

  9. 从1到2 | ETH 2.0为我们带来了什么

    以太坊创始人Vitalik Buterin(以下简称V神)提出了一项名为信标链的新提议,该提议建议在以太坊网络的新迭代中,基于权益证明(POS)的共识,从根本上修改其公链的角色. 非营利机构Prysm ...

最新文章

  1. 探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用23
  2. rabbitmq beam.smp cpu利用率过高
  3. cuda win10安装
  4. 学python好不好-26岁了,自学Python怎么样?
  5. shell脚本判断输入参数个数
  6. 机器学习算法加强——SVM(支持向量机)
  7. 轨迹规划概念总结——Dubins曲线
  8. [Windows] Windows 8.1 取消在任务栏显示应用商店的应用
  9. 使用H5实现机器人脸
  10. wind 下装mysql,windows 下安装MySQL
  11. word文档保存发生错误_文档还是没有发生
  12. OpenGL显示列表
  13. php 5.3新增的闭包语法介绍function() use() {}
  14. 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答
  15. linux权限设定的判定,linux中如何通过脚本判定文件的群组权限
  16. elementUI 下拉框隐藏时触发相关事件(下拉框下拉显示时不触发)
  17. charles抓包踩过的坑之一 ——手机开了代理,不能访问网络
  18. 2021年泰迪杯数据挖掘赛B题数据——岩石图像的智能分类
  19. 如何压缩pdf文件 把pdf文件变小
  20. 智能窗帘系统c语言程序,基于51单片机的智能窗帘控制系统设计与实现毕业论文.doc...

热门文章

  1. 坑爹!花费2亿耗时2年,网站没建完Java都写不好,顶级咨询公司埃森哲被告上法庭
  2. Kubernetes 2018 年度简史
  3. 分布式、高并发、多线程,到底有什么区别?
  4. Spring Boot 2.1.0 已发布,7 个重大更新! 1
  5. mysql实验四图书视图_[数据库实验四.doc
  6. python for in循环_Python傻瓜教程:跟我学for循环
  7. 恢复mysql数据库详细图解_binlog恢复mysql数据库超详细步骤
  8. 计算机网络第4版潘爱民_学术活动 钱江会计实务精英讲坛预告(第84期)| 何继昌 : 战略视角下之财务分析应用实践 兼选股案例分享...
  9. 重新考虑数据中心的冷却方案—水冷却或将再次兴起
  10. 数据中心液体冷却技术的五个主要关注点