第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)
一. 语法糖简介
语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率,在性能上也不会带来损失。
在编译器发展早期,编译器科学家门一直在想方设法的优化编译器生成的代码,这个时候,编译器做的主要是对机器优化,因为那个时候机器的时间非常宝贵,机器运算速度也不快,今天我们有了足够好的机器了(但并不是说我们可以不关注性能的编写程序),而且作为编写软件的人来说,比机器的时间宝贵得多,所以今天的编译器也在向人优化了,从编程语言的发展之路来讲,今天的编程语言比昨天的语言更高级,也更人性化了,我们只要编写更少的代码,更符合人的思维的代码,而只要关注我们值的关注的地方。体力活儿就交给编译器吧。
二. 常用语法糖
1. 自动属性
(1). 传统的方式在类中声明一个属性,需要先声明一个私有变量的字段,然后在配合公有属性,如下面的:userId属性。
(2). 利用自动属性:不需要字段,声明一个空属性,直接get,set(快捷键:prop),编译时编译器为我们生成存取数据的字段. 如下面的:userName属性。
public class userInfor
{
//私有字段
private string _userId;
//公有属性
public string userId
{
get
{
return _userId;
}
set
{
_userId = value;
}
} public string useName { get; set; } /// <summary>
/// 为了后面的反射调用
/// </summary>
public void Test()
{
Console.WriteLine("我是一个方法");
} }
2. var和dynamic
(1). var类型:声明变量的时候可以不指定类型,由编译器编译的时候来指定类型。
①:必须在定义的时候初始化
②:必须是局部变量
③:一旦初始化完成,不能再给变量赋与初始值不同类型的值了,但是可以赋相同类型的不同值.
④:var在效率是和使用强类型方式定义变量是一样的
(2). dynamic类型:编译期间不做任何检查,运行期间才确定类型。
①:定义的时候可以不必初始化
②:可以是全局变量,也可以是局部变量
dynamic在反射中的应用:通过反射拿到类后,赋值给dynamic类型,该类型的对象可以直接点来调用方法
缺点:dynamic在运行的时候才进行检测,导致编译的时候即使有错误也不会被发现; 不能用dynamic类型给确定类型的变量进行赋值
public class CompareTwo
{
//2. 可使用的范围
// var b1 = 1; //报错,var必须定义在方法呃逆
// dynamic b2 = 2; //正常
public static void Show()
{
{
//1. 初始化比较
//var a1; //报错,定义的时候必须初始化
//dynamic a2; //正常
}
{
//3. 赋值问题
var c1 = ;
//c1 = "2"; //报错,初始化完成不能赋值不同类型的变量
c1 = ; //正常,初始化完成可以赋值相同类型的变量的不同值 dynamic d1 = ;
d1 = ""; //正常,运行时检查进行类型指定,所以在编译的时候不会报错
d1 = ; //正常 var userInfor = new userInfor();
userInfor.useName = "";
userInfor.userId = "";
// userInfor.fk123(); //报错,编译不通过 dynamic userInfor2 = new userInfor();
userInfor2.userId = "";
userInfor2.useName = "ypf";
//调用不存在的方法 (因为编译的时候根本不检查,所以不会报错,运行的时候报错)
//userInfor2.fk123(); //编译期间不报错,运行的时候报错 }
{
//4. dynamic在反射中的应用
//4.1 常规反射调用方法
Type type1 = typeof(userInfor);
object oStudent = Activator.CreateInstance(type1);
MethodInfo method = type1.GetMethod("Test");
method.Invoke(oStudent,null); //4.2 利用dynamic简化调用
//定义和编译的时候可以是任何类型,运行的时候进行转换
dynamic oStudent2 = Activator.CreateInstance(type1);
oStudent2.Test(); }
}
}
3. 可选参数
给方法的参数可以指定默认值,如果在调用该方法的时候,不传入该参数,则走默认值,传入的话,则覆盖默认参数.
(1). 有默认值的参数必须定义在没有默认值的参数之后
(2). 默认参数必须是常量,不能是变量
(3). ref和out参数不能指定默认值
public class OptionalParas
{
public static void Test(string useName,string userPwd,int userAge=,string userSex="男")
{
Console.WriteLine("userName:{0},userPwd:{1},userAge:{2},userSex:{3}", useName, userPwd, userAge, userSex);
}
}
//3.可选参数
Console.WriteLine("----------------------3.可选参数-------------------------");
OptionalParas.Test("ypf1", "");
OptionalParas.Test("ypf2", "", , "女");
4. 对象(集合)初始化器
public class ObjectInitilize
{
public static void Test()
{ //一.对象初始化
//1. 传统初始化对象的方式
userInfor uInfor1 = new userInfor();
uInfor1.userId = "";
uInfor1.useName = "ypf1"; //2.对象初始化器
userInfor uInfor2 = new userInfor()
{
userId="",
useName="ypf2"
};
userInfor uInfor3 = new userInfor()
{
userId = "",
useName = "ypf3"
}; //二. 集合初始化
//1. 传统方式
List<userInfor> uList = new List<userInfor>();
uList.Add(uInfor1);
uList.Add(uInfor2); //2. 集合初始化器
List<userInfor> uList2 = new List<userInfor>(){
uInfor1,
uInfor2,
new userInfor(){
userId="",
useName="ypf4"
}
}; }
}
5. ref和out
二者共同的使用场景,将ref或out参数传入方法中,执行完方法后,可以直接使用ref或out参数值。
(1). ref必须在使用前赋值,即传入方法前进行定义并赋值
(2). out必须在方法中赋值然后使用,在调用方法前声明两个未实例化的变量,用来传入和接收使用
举例:有两个int类型的值num1和num2,分别使用ref和out传入对应的方法中,进行值交换。
public class CompareRO
{
/// <summary>
/// ref的使用
/// </summary>
public static void TestRef()
{
int num1 = ;
int num2 = ;
Func1(ref num1, ref num2);
Console.WriteLine("num1的值为:{0},num2的值为:{1}", num1, num2);
} public static void TestOut()
{
int num1;
int num2;
Func2(out num1, out num2);
Console.WriteLine("num1的值为:{0},num2的值为:{1}", num1, num2);
} #region ref版参数值交换
public static void Func1(ref int n1, ref int n2)
{
int a = n1;
n1 = n2;
n2 = a;
}
#endregion #region out版参数值交换
public static void Func2(out int n1,out int n2)
{
n1 = ;
n2 = ;
int a = n1;
n1 = n2;
n2 = a;
}
#endregion }
6. 匿名类/匿名方法
7. 扩展方法
第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)的更多相关文章
- C#语法糖之第二篇: 参数默认值和命名参数 对象初始化器与集合初始化器
今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完 ...
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
- C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法
1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName ...
- Linq之隐式类型、自动属性、初始化器、匿名类
目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...
- C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询
1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...
- [读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法
前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...
- [C#详解] (1) 自动属性、初始化器、扩展方法
文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/CSharp-focus-1.html 代码下载:点我下载 目录 前言 属性与自动属性 属性 自动属 ...
- C#学习笔记四: C#3.0自动属性&匿名属性及扩展方法
前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...
- C#的隐式类型、匿名类型、自动属性、初始化器
1.隐式类型 1)源起 在隐式类型出现之前,我们声明一个变量时,需要为它指定相应的类型,甚至在foreach一个集合的时候,也要为遍历的集合元素,指定变量的类型,隐式类型出现后,程序员就不用再做这个工 ...
随机推荐
- vue 首页问题
(现在其实处于不知道自己不知道状态,前端其实很多东东,不信弄个微博试试,还有那些概念的to thi tha) 1.压缩 一般 vue-cli已经压缩了 比如js 的,一般4M多压缩到 1M,还有css ...
- linux vi粘贴格式易错乱
对于一些冗长的代码完全可以粘贴的时候,vi粘贴所有格式全部错乱,完全无法阅读. 解决办法:esc进入命令行模式后,输入 :set paste,然后再i进入粘贴编辑模式,即可正常复制并保留原有格式-
- 【MOS】在不同版本和平台之间进行还原或复制 (文档 ID 1526162.1)--跨版本恢复
参考链接:http://blog.itpub.net/26736162/viewspace-1549041/
- Redis原理
RESP协议 支持tcp协议.基本数据类型,比如数组,字符串等,也可支持其他的通信场景. 模拟redis接收传输过来的set数据 //ServerSocket监听6379端口模拟redis publi ...
- 错误:set Assigning an instance of 'esri.***' which is not a subclass of 'esri.***‘
1. 出现 set Assigning an instance of 'esri.***' which is not a subclass of 'esri.***‘的错误原因 是 因为没有找见 ...
- Binary Search(Java)(递归)
public static int rank(int[] array, int k, int front, int rear) { if(front > rear) return -1; int ...
- iview库表table组件内嵌套Select组件
表格内render函数渲染Select组件 { title: '属性值', key: 'values', render:(h,params)=>{ return h('Select',{ ...
- JDBC连接池之C3P0
1.导入jar包 c3p0-0.9.1.jar mchange-commons-java-0.2.3.4(注:该jar包是c3p0数据库连接池的辅助包,没有这个包系统启动的时候会报classnotfo ...
- 关于CentOS7.2 控制面板不显示输入法,或者无法调出输入的问题。(已解决)
问题描述: CentOS7.2 桌面系统控制面板突然就不显示输入法的图标,快捷键也调不出输入法. 解决方法: test@base0200: ~ $ ibus-setup 调出ibus首选项--> ...
- 【算法】—— LRU算法
LRU原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. 实现1 最常见的 ...