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

一. 语法糖简介

      语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(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)-匿名类、匿名方法、扩展方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java不用插件播放媒体文件_java servlet不用插件上传文件:

展开全部import java.net.*;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class SaveFileServlet extends HttpServlet{FileWriter savefile;String filename null;String value null;/*** Handles a POST request*/publ…

第八节:语法总结(2)(匿名类、匿名方法、扩展方法)

一. 匿名类 1. 传统的方式给类赋值&#xff0c;需要先建一个实体类→实例化→赋值&#xff0c;步骤很繁琐&#xff0c;在.Net 3.0时代&#xff0c;微软引入匿名类的概念&#xff0c;简化了代码编写&#xff0c;提高了开发效率。 匿名类的声明语法&#xff1a; var objnew {字段…

java 里面matches什么意思_Java Regex中的matches()和find()之间的区别

如果完整string匹配&#xff0c; matches()将只返回true。 find()会尝试find匹配正则expression式的子string中的下一个匹配项。 注意强调“下一个”。 这意味着&#xff0c;多次调用find()的结果可能不一样。 另外&#xff0c;通过使用find()你可以调用start()来返回子string匹…

第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

一. 委托的发展历史和基本用法 说起委托&#xff0c;每个人可能都会对他有不同的理解&#xff0c;结合实战中委托的使用&#xff0c;我对其理解是&#xff1a;委托和类一样&#xff0c;是用户的一个自定义类型&#xff0c;委托可以有参数、有返回值&#xff0c;委托的关键字是d…

java为什么不使用odbc_java jdbc和odbc的区别是什么?jdbc和odbc的关系是怎样的?

对于jdbc和odbc你都了解多少呢?今天要给大家讲到的就是jdbc和odbc之间的内容&#xff0c;一起来了解一下jdbc和odbc的区别以及关系是怎样的吧!下面先来给大家介绍一下jdbc和odbc之间的区别。总的来说&#xff0c;jdbc和odbc的区别可以划分成三大部分&#xff0c;一起来看看。一…

第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

一. 泛型委托 所谓的泛型委托&#xff0c;即自定义委托的参数可以用泛型约束&#xff0c;同时内置委托Func和Action本身就是泛型委托。 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下。 1 public class Calculator22 {3 //传统解决方案一&am…

java中sql之count_按SQL Server中的count()子句分组

我正在尝试编写一个SQL查询&#xff0c;它将返回聚合值列表;但是&#xff0c;我想通过其中一个聚合值(计数)对查询进行分组&#xff1a;select t.Field1, count(distinct(t.Field2), SUM(t.Value1)from MyTable tgroup by t.Field1, count(t.Field2)我已经尝试将计数放入子查询…

java+sm4+加密算法_SM4加密算法实现Java和C#相互加密解密

https://www.cnblogs.com/miaoziblog/p/9040473.html近期由于项目需要使用SM4对数据进行加密&#xff0c;然后传给Java后台&#xff0c;Java后台使用的也是SM4的加密算法但是就是解密不正确&#xff0c;经过一步步调试发现Java中好多数据类型与C#的相同的数据类型是存在不同的比…

用java设计节拍器_具有高速的Java节拍器

关于Thread.sleep()不可靠的答案是正确的&#xff1a;你不能指望它完全返回你指定的时间.事实上,我很惊讶你的节拍器可以使用,特别是当你的系统负载不足时.阅读Thread.sleep()的文档以获取更多详细信息.关于MIDI的Max Beikirch的答案是一个很好的建议&#xff1a;MIDI处理时机非…

java隐藏密钥_java – 在Android中隐藏密钥库密码的最佳方法是什么?

我是Android开发和实现SSLSockets的新手.在做了一些挖掘后,我能够设置一个正常工作的简单服务器/客户端.我认为实现可以使用一些工作,并且难以将密码加载到密钥库而不用纯文本.这是客户端的一些代码.如您所见,我将密码硬编码到本地var中.是否有更好的方法加载密钥库密码,所以我…

DotNet进阶系列

一. 回顾历史 回顾个人发展历程&#xff0c;自2012年初次接触开发至今(2018年)已经有六个年头&#xff0c;这期间陆陆续续学习并掌握了不少技术&#xff0c;C#语言、ORM框架、多线程技术、设计模式、前端技术、MVC、MVVM框架思想等等&#xff0c;每种技术随着多次使用&#xff…

美团科技 Java工程师_美团Java工程师面试题(2018秋招)

第一次面试1.小数是怎么存的2.算法题&#xff1a;N二进制有多少个13.Linux命令(不熟悉4.JVM垃圾回收算法5.C或者伪代码实现复制算法6.volatile7.树的先序中序后序以及应用场景8.Mysql存储记录的数据结构9.索引数据结构10.为什么不用AVL和红黑树存&#xff1f;11.说实习项目12.r…

第十一节:特性(常见的特性标签、自定义特性、特性的使用案例)

一. 基本概念 1. 什么是特性? MSDN官方给出的定义时&#xff1a;公共语言运行时允许添加类似关键字的描述声明&#xff0c;叫做特性&#xff0c;它对程序中的元素进行标注&#xff0c;如类型、字段、方法和属性等。Attribute和Microsoft .Net Framework文件的元数据&#xff…

java不建议用全局变量吗_不要使用全局变量, ThreadLocal也不行

不要使用全局变量的道理大家都懂&#xff0c;基本上在大家学习编程过程中很早就会被教育到&#xff0c;但是有时候我们也会禁不住诱惑用到一些似非实是的全局变量&#xff0c;只不过这些全局变量会穿上马甲&#xff0c;让你不会一下看穿它的巨大危害&#xff0c;这里就讲一下我…

第十二节:Lambda、linq、SQL的相爱相杀(1)

一. 谈情怀 Lambda、Linq、SQL伴随着我的开发一年又一年&#xff0c;但它们三者并没有此消彼长&#xff0c;各自占有这一定的比重&#xff0c;起着不可替代的作用。 相信我们最先接触的应该就是SQL了&#xff0c;凡是科班出身的人&#xff0c;大学期间都会学习SQL Server数据库…

php java 共享session_PHP 实现多服务器共享 SESSION 数据

一、问题起源稍大一些的网站&#xff0c;通常都会有好几个服务器&#xff0c;每个服务器运行着不同功能的模块&#xff0c;使用不同的二级域名&#xff0c;而一个整体性强的网站&#xff0c;用户系统是统一的&#xff0c;即一套用户名、密码在整个网站的各个模块中都是可以登录…

第十三节:Lambda、linq、SQL的相爱相杀(2)

一. Linq开篇 1.Where用法 linq中where的用法与SQL中where的用法基本一致。 1 #region 01-where用法2 {3 //1. where用法4 //1.1 查询账号为admin的用户信息5 Console.WriteLine("------------…

asp 调用java文件上传_用asp实现文件浏览、上传、下载的程序

可以放在服务器上&#xff0c;对服务器上的文件进行浏览、上传、下载&#xff0c;可下载文件源码。把下所有代码入在一个文件里即可&#xff0c;文件的后缀要为asp。thedir request("thedir")if thedir "" thenfolderini server.mappath(".")…

第十四节:Lambda、linq、SQL的相爱相杀(3)

一. SQL 开篇 1. where用法 1    #region 封装EF调用SQL语句查询 2 public static List<T> ExecuteQuery<T>(string sql, params SqlParameter[] pars) 3 { 4 return db.Database.SqlQuery<T>(sql, pars).ToList(); 5 …

hive mysql windows_Java-从MySQL到Hive导入,其中MySQL在Windows上运行,而Hive在Cent OS上运行(Horton Sandbox)...

在任何答案和评论之前.我尝试了在Stackoverflow中找到的几个选项,但均以失败告终.以下是这些链接-我通过命令行在Horton Sandbox中进行了尝试并成功.sqoop import --connect jdbc:mysql://192.168.56.101:3316/database_name --usernameuser --passwordpwd --table table_name …