一. 语法糖简介

    语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率,在性能上也不会带来损失。

在编译器发展早期,编译器科学家门一直在想方设法的优化编译器生成的代码,这个时候,编译器做的主要是对机器优化,因为那个时候机器的时间非常宝贵,机器运算速度也不快,今天我们有了足够好的机器了(但并不是说我们可以不关注性能的编写程序),而且作为编写软件的人来说,比机器的时间宝贵得多,所以今天的编译器也在向人优化了,从编程语言的发展之路来讲,今天的编程语言比昨天的语言更高级,也更人性化了,我们只要编写更少的代码,更符合人的思维的代码,而只要关注我们值的关注的地方。体力活儿就交给编译器吧。

二. 常用语法糖

1. 自动属性

(1).  传统的方式在类中声明一个属性,需要先声明一个私有变量的字段,然后在配合公有属性,如下面的:userId属性。

(2). 利用自动属性:不需要字段,声明一个空属性,直接get,set(快捷键:prop),编译时编译器为我们生成存取数据的字段. 如下面的:userName属性。

 1  public class userInfor2     {3         //私有字段4         private string _userId;5         //公有属性6         public string userId7         {8             get9             {
10                 return _userId;
11             }
12             set
13             {
14                 _userId = value;
15             }
16         }
17
18         public string useName { get; set; }
19
20
21         /// <summary>
22         /// 为了后面的反射调用
23         /// </summary>
24         public void Test()
25         {
26             Console.WriteLine("我是一个方法");
27         }
28
29     }

2. var和dynamic

(1). var类型:声明变量的时候可以不指定类型,由编译器编译的时候来指定类型。

  ①:必须在定义的时候初始化

  ②:必须是局部变量

  ③:一旦初始化完成,不能再给变量赋与初始值不同类型的值了,但是可以赋相同类型的不同值.

  ④:var在效率是和使用强类型方式定义变量是一样的

(2). dynamic类型:编译期间不做任何检查,运行期间才确定类型。

  ①:定义的时候可以不必初始化

  ②:可以是全局变量,也可以是局部变量

  dynamic在反射中的应用:通过反射拿到类后,赋值给dynamic类型,该类型的对象可以直接点来调用方法

  缺点:dynamic在运行的时候才进行检测,导致编译的时候即使有错误也不会被发现; 不能用dynamic类型给确定类型的变量进行赋值

 1  public class CompareTwo2     {3         //2. 可使用的范围4         // var b1 = 1;        //报错,var必须定义在方法呃逆5         // dynamic b2 = 2;    //正常6         public static void Show()7         {8             {9                 //1. 初始化比较
10                 //var a1;         //报错,定义的时候必须初始化
11                 //dynamic a2;     //正常
12             }
13             {
14                 //3. 赋值问题
15                 var c1 = 2;
16                 //c1 = "2";   //报错,初始化完成不能赋值不同类型的变量
17                 c1 = 3;    //正常,初始化完成可以赋值相同类型的变量的不同值
18
19                 dynamic d1 = 2;
20                 d1 = "2";      //正常,运行时检查进行类型指定,所以在编译的时候不会报错
21                 d1 = 3;       //正常
22
23
24                 var userInfor = new userInfor();
25                 userInfor.useName = "1";
26                 userInfor.userId = "2";
27                 // userInfor.fk123();    //报错,编译不通过
28
29                 dynamic userInfor2 = new userInfor();
30                 userInfor2.userId = "1";
31                 userInfor2.useName = "ypf";
32                 //调用不存在的方法  (因为编译的时候根本不检查,所以不会报错,运行的时候报错)
33                 //userInfor2.fk123();    //编译期间不报错,运行的时候报错
34
35             }
36             {
37                 //4. dynamic在反射中的应用
38                 //4.1 常规反射调用方法
39                 Type type1 = typeof(userInfor);
40                 object oStudent = Activator.CreateInstance(type1);
41                 MethodInfo method = type1.GetMethod("Test");
42                 method.Invoke(oStudent,null);
43
44                 //4.2 利用dynamic简化调用
45                 //定义和编译的时候可以是任何类型,运行的时候进行转换
46                 dynamic oStudent2 = Activator.CreateInstance(type1);
47                 oStudent2.Test();
48
49             }
50         }
51     }

3. 可选参数

给方法的参数可以指定默认值,如果在调用该方法的时候,不传入该参数,则走默认值,传入的话,则覆盖默认参数.

(1).  有默认值的参数必须定义在没有默认值的参数之后

(2).  默认参数必须是常量,不能是变量

(3).  ref和out参数不能指定默认值

1   public class OptionalParas
2     {
3         public static void Test(string useName,string userPwd,int userAge=16,string userSex="男")
4         {
5             Console.WriteLine("userName:{0},userPwd:{1},userAge:{2},userSex:{3}", useName, userPwd, userAge, userSex);
6         }
7     }

1        //3.可选参数
2             Console.WriteLine("----------------------3.可选参数-------------------------");
3             OptionalParas.Test("ypf1", "123456");
4             OptionalParas.Test("ypf2", "654321", 56, "女");

4. 对象(集合)初始化器

 1  public class ObjectInitilize2     {3         public static void Test()4         {5            6                 //一.对象初始化7                 //1. 传统初始化对象的方式8                 userInfor uInfor1 = new userInfor();9                 uInfor1.userId = "1";
10                 uInfor1.useName = "ypf1";
11
12                 //2.对象初始化器
13                 userInfor uInfor2 = new userInfor()
14                 {
15                     userId="2",
16                     useName="ypf2"
17                 };
18                 userInfor uInfor3 = new userInfor()
19                 {
20                     userId = "3",
21                     useName = "ypf3"
22                 };
23
24                 //二. 集合初始化
25                 //1. 传统方式
26                 List<userInfor> uList = new List<userInfor>();
27                 uList.Add(uInfor1);
28                 uList.Add(uInfor2);
29
30                 //2. 集合初始化器
31                 List<userInfor> uList2 = new List<userInfor>(){
32                     uInfor1,
33                     uInfor2,
34                     new userInfor(){
35                         userId="4",
36                         useName="ypf4"
37                     }
38                 };
39
40         }
41     }

5. ref和out

二者共同的使用场景,将ref或out参数传入方法中,执行完方法后,可以直接使用ref或out参数值。

  (1). ref必须在使用前赋值,即传入方法前进行定义并赋值

  (2). out必须在方法中赋值然后使用,在调用方法前声明两个未实例化的变量,用来传入和接收使用

举例:有两个int类型的值num1和num2,分别使用ref和out传入对应的方法中,进行值交换。

 1  public class CompareRO2     {3         /// <summary>4         /// ref的使用5         /// </summary>6         public static void TestRef()7         {8             int num1 = 5;9             int num2 = 10;
10             Func1(ref num1, ref num2);
11             Console.WriteLine("num1的值为:{0},num2的值为:{1}", num1, num2);
12         }
13
14         public static void TestOut()
15         {
16             int num1;
17             int num2;
18             Func2(out num1, out num2);
19             Console.WriteLine("num1的值为:{0},num2的值为:{1}", num1, num2);
20         }
21
22         #region ref版参数值交换
23         public static void Func1(ref int n1, ref int n2)
24         {
25             int a = n1;
26             n1 = n2;
27             n2 = a;
28         }
29         #endregion
30
31         #region out版参数值交换
32         public static void Func2(out int n1,out int n2)
33         {
34             n1 = 5;
35             n2 = 10;
36             int a = n1;
37             n1 = n2;
38             n2 = a;
39         }
40         #endregion
41
42     }

6. 匿名类/匿名方法

  详见:.Net进阶系列(3)-匿名类、匿名方法、扩展方法

7. 扩展方法

  详见:.Net进阶系列(3)-匿名类、匿名方法、扩展方法

第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)相关推荐

  1. html的课设作业6,第七节课html标签元素属性作业-2019-9-6 作业

    实例 html> 2019最新课程表 table { /* border: 1px solid #000; */ /* border-collapse: collapse; */ width:  ...

  2. Linq之隐式类型、自动属性、初始化器、匿名类

    目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...

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

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

  4. linux分区命名规则,《linux就该这么学》第七节课:文件的各种权限以及linux分区命名规则...

    笔记 (借鉴请改动) 5.3:文件特殊权限 SUID  临时拥有文件所有者的权限(基本上只是执行权限) SGID  临时拥有文件所有组的权限,在目录中创建文件自动继承该目录的用户组. SBIT  粘滞 ...

  5. Vue.js实战之系统学习第七节

    想看上一节的请点击: Vue.js实战之系统学习第六节 接下来我们要学习第七节了,时间过的好快. 组件详解 组件是Vue.js的核心功能,也是整个框架设计最精彩的地方,当然也是最难掌握的.本章节将带你 ...

  6. 软考-架构师-第三章-数据库系统 第七节 数据库设计(读书笔记)

    版权声明 主要针对希赛出版的架构师考试教程<系统架构设计师教程(第4版)>,作者"希赛教育软考学院".完成相关的读书笔记以便后期自查,仅供个人学习使用,不得用于任何商业 ...

  7. 第七节 GUI 图形用户界面

    第七节 GUI 图形用户界面 1. Swing 概述 2. 顶级容器 2.1 JFrame容器 2.2 JDialog容器 3. 布局管理器 3.1 BorderLayout(边界布局管理器) 3.2 ...

  8. 第七节 红帽认证培训 用户身份与文件权限(5.1-5.3)

    第七节 红帽认证培训 用户身份与文件权限(5.1-5.3) 文章目录 5.1 用户身份与能力 1.id 命令 2.useradd命令 3.groupadd命令 4.usermod命令 5. passw ...

  9. php静态成员的例子,第七节 类的静态成员 [7]

    第七节 类的静态成员 [7] 更新时间:2006年10月09日 00:00:00   作者: 类的静态成员与一般的类成员不同: 静态成员与对象的实例无关,只与类本身有关. 他们用来实现类要封装的功能和 ...

最新文章

  1. Python fabric实践操作
  2. pytorch基础一:张量
  3. 网站优化:浏览器缓存控制简介及配置策略
  4. wget ip_全球IP厂商TOP 10排名:后来者虎视眈眈
  5. PG基于pgpool-II实现读写分离和负载均衡
  6. 深信服AC本地用户密码认证配置
  7. 导入资料的预览与修改
  8. MyBatis最新官方下载地址
  9. matlab 小波分析工具
  10. Linux可执行文件
  11. RuntimeError: CUDA error (10): invalid device ordinal
  12. python 网络设备巡检_「python」使用SSH进行网络设备巡检
  13. RabbitMQ——01安装
  14. html制作横向菜单,CSS 横向菜单的制作
  15. 前端工程师为什么会这么值钱?原来真相在这里
  16. 将openwrt软路由装进U盘中并运行
  17. 一个古典App开发者的DApp开发之路
  18. 骗术一览,大猫小猫都小心了!【转载】
  19. windows文本转语音调用
  20. 最新易语言调用大漠插件制作脚本入门教程

热门文章

  1. python学习第22天
  2. Windows10搭建FTP服务器
  3. bzoj 4016: [FJOI2014]最短路径树问题
  4. Python web开发——自定义userprofile(用户描述)
  5. 如何写计算机会议的rebuttal
  6. Servlet JSP系列文章总结
  7. 基于visual Studio2013解决面试题之0702输出数字
  8. [Leetcode][第77题][JAVA][组合][回溯]
  9. php html登陆逻辑,保持演示文稿(HTML)和逻辑(PHP)分开
  10. action中写php函数,WordPress中add_action(将函数连接到指定action)