C#3.0中如何实现自动属性和对象初始化器
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,小编给大家分享一下C#3.0中如何实现自动属性和对象初始化器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.匿名属性定义
千家信息网最后更新 2025年02月06日C#3.0中如何实现自动属性和对象初始化器
小编给大家分享一下C#3.0中如何实现自动属性和对象初始化器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1.匿名属性
定义属性如下:
public class Employee{public int Id { get; set; }public string Name { get; set; }public string Sex { get; set; }public int Age { get; set; }public string BirthDate { get; set; }}在C#3.0 之前的写法如下:public class Employee{private int _id;private string _name;private string _sex;private int _age;private string _birthDate; public int Id{get { return _id; }set { _id = value; }}public string Name{get { return _name; }set { _name = value; }}public string Sex{get { return _sex; }set { _sex = value; }}public int Age{get { return _age; }set { _age = value; }}public string BirthDate{get { return _birthDate; }set { _birthDate = value; }}}
仅从代码量上就前者比后者减少了2/3的代码,这对提高效率是显而易见的,那么这些代码都到哪里去了呢?其实那些额外的代码都是由编译器为我们完成的,编译器会将那些我们"省去"的代码编译成托管IL代码的时候补进去,两者中代码在最终生成的IL代码的体积是差不多的。
上图中的IL代码中我们看到了k_BackingField之类的字段就是编译器自动产生的字段代码。
2.对象初始化器,原来的对象初始化都要进行先创建构造方法,然后才能进行成员的相关操作,C#3.0 提供了对象成员的直接初始化的能力,和初始化一个集合或者是数组一样来初始化对象。
相面来看,通过对象初始化器对上面的的Employee类进行进行调用:
Employee employee = new Employee { Id = 1, Name = "蓝之风", Age = 24, BirthDate = "1984-10-21", Sex = "男" }; BirthDate = "1984-10-21", Sex = "男" }; |
就是对象的初始化,看到代码很简洁,输出的结果如下:
在C#3.0之前的做法是:
Employee employee = new Employee(); |
或者通过重载构造方法的方式来初始化这些属性,二者的达到的效果是相同的,但是前者使用起来方便了些,代码量减少了许多,这个过程是怎么完成的呢?其实C#本身并没有太大的变化,这些都是在语法上的一些改变,使得编写代码的时候更方便效率更高,把一些编译器可以推断出来完成的工作让编译器来做了,编译器在编译程序的时候将我们没有实现的代码替我们实现来生成IL代码的:
method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 175 (0xaf)
.maxstack 2
.locals init ([0] class CS30.Employee employee,
[1] class CS30.Employee '<>g__initLocal0')
IL_0000: nop
IL_0001: newobj instance void CS30.Employee::.ctor()
IL_0006: stloc.1
IL_0007: ldloc.1
IL_0008: ldc.i4.1
IL_0009: callvirt instance void CS30.Employee::set_Id(int32)
IL_000e: nop
IL_000f: ldloc.1
IL_0010: ldstr bytearray (DD 84 4B 4E CE 98 ) // ..KN..
IL_0015: callvirt instance void CS30.Employee::set_Name(string)
IL_001a: nop
IL_001b: ldloc.1
IL_001c: ldc.i4.s 24
IL_001e: callvirt instance void CS30.Employee::set_Age(int32)
IL_0023: nop
IL_0024: ldloc.1
IL_0025: ldstr "1984-10-21"
IL_002a: callvirt instance void CS30.Employee::set_BirthDate(string)
IL_002f: nop
IL_0030: ldloc.1
IL_0031: ldstr bytearray (37 75 ) // 7u
IL_0036: callvirt instance void CS30.Employee::set_Sex(string)
IL_003b: nop
IL_003c: ldloc.1
IL_003d: stloc.0
IL_003e: ldstr bytearray (16 7F F7 53 3B 00 7B 00 30 00 7D 00 ) // ...S;.{.0.}.
IL_0043: ldloc.0
IL_0044: callvirt instance int32 CS30.Employee::get_Id()
IL_0049: box [mscorlib]System.Int32
IL_004e: call void [mscorlib]System.Console::WriteLine(string,
object)
IL_0053: nop
IL_0054: ldstr bytearray (D3 59 0D 54 3A 00 7B 00 30 00 7D 00 ) // .Y.T:.{.0.}.
IL_0059: ldloc.0
IL_005a: callvirt instance string CS30.Employee::get_Name()
IL_005f: call void [mscorlib]System.Console::WriteLine(string,
object)
IL_0064: nop
IL_0065: ldstr bytearray (74 5E 84 9F 3A 00 7B 00 30 00 7D 00 ) // t^..:.{.0.}.
IL_006a: ldloc.0
IL_006b: callvirt instance int32 CS30.Employee::get_Age()
IL_0070: box [mscorlib]System.Int32
IL_0075: call void [mscorlib]System.Console::WriteLine(string,
object)
IL_007a: nop
IL_007b: ldstr bytearray (1F 75 E5 65 3A 00 7B 00 30 00 7D 00 ) // .u.e:.{.0.}.
IL_0080: ldloc.0
IL_0081: callvirt instance string CS30.Employee::get_BirthDate()
IL_0086: call void [mscorlib]System.Console::WriteLine(string,
object)
IL_008b: nop
IL_008c: ldstr bytearray (27 60 2B 52 3A 00 7B 00 30 00 7D 00 ) // '`+R:.{.0.}.
IL_0091: ldloc.0
IL_0092: callvirt instance string CS30.Employee::get_Sex()
IL_0097: call void [mscorlib]System.Console::WriteLine(string,
object)
IL_009c: nop
IL_009d: ldstr bytearray (F7 8B 09 63 FB 4E 0F 61 2E 95 E7 7E ED 7E 2E 00 // ...c.N.a...~.~..
2E 00 2E 00 ) // ....
IL_00a2: call void [mscorlib]System.Console::WriteLine(string)
IL_00a7: nop
IL_00a8: call string [mscorlib]System.Console::ReadLine()
IL_00ad: pop
IL_00ae: ret
} // end of method Program::Main
以上是"C#3.0中如何实现自动属性和对象初始化器"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
代码
对象
编译
编译器
属性
时候
篇文章
之风
内容
姓名
字段
就是
年龄
性别
成员
效率
方法
生日
生成
相同
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库三级项目报告书
数据库安装要求
关闭服务器自动分配内存
网络技术是哪里的
广东数据库安全审计
纪检人员网络安全
七鼎云互联网科技
软件开发流程模型
盐城机电计算机网络技术怎么样
汽车软件开发项目管理书籍
雷霆万钧网络技术有限公司
什么叫无法获取后台数据库时钟
河津市方宇网络技术有限公司
查询服务器绑定域名
全民广场舞软件开发者
数据库系统的安全框架有哪些
网络安全宣传周有奖问答答案
cpu与数据库的连接例题
网络安全教育”主题班会信息
云数据库 集合记录数
服务器冷引导
公安部网络安全检查视频会议
金地数据库已锁定
网络安全法全文 找法网
长沙软件开发专业大学排名
敏感节点网络安全保障
宿迁市网络安全竞赛结果公示
网络安全大专好找工作吗
数据库的应用程序名称设置
互联网技术的科技论文题目