C#语言各个版本特性(一)
一、c#版本中添加的功能:
C#2.0
泛型
部分类型
匿名方法
迭代器
可空类型
Getter / setter单独可访问性
方法组转换(代表)
Co- and Contra-variance for delegates
静态类
Delegate inference
C#3.0
隐式类型局部变量
对象和收集初始化器
自动实现的属性
匿名类型
扩展方法
查询表达式
Lambda表达式
表达树
部分方法
C#4.0
动态绑定
命名和可选参数
Generic co- and contravariance
嵌入式互操作类型(“NoPIA”)
C#5.0
异步方法
Caller info attributes
C#6.0
Compiler-as-a-service(Roslyn)
将静态类型成员导入命名空间
异常过滤器
在Catch和Finally中使用Await
自动属性初始化器
只读属性的默认值
Expression-bodied members
Null-conditional operators(空条件运算符,简洁检查)
字符串插值
- nameof operator
字典初始化器
C#7.0
out变量
模式匹配
元组
解构
局部函数
数字分隔符
二进制文字
局部引用和引用返回
扩展异步返回类型
表达式的构造函数和finalizers
- Expression bodied getters and setters
throw表达式
C#7.1
- Async main
默认表达式
1.C#1.1代码
using System.Collections;
using System.ComponentModel; namespace Chapter01.CSharp1
{
[Description("Listing 1.01")]
public class Product
{
string name;
public string Name
{
get { return name; }
} decimal price;
public decimal Price
{
get { return price; }
} public Product(string name, decimal price)
{
this.name = name;
this.price = price;
} public static ArrayList GetSampleProducts()
{
ArrayList list = new ArrayList();
list.Add(new Product("West Side Story", 9.99m));
list.Add(new Product("Assassins", 14.99m));
list.Add(new Product("Frogs", 13.99m));
list.Add(new Product("Sweeney Todd", 10.99m));
return list;
} public override string ToString()
{
return string.Format("{0}: {1}", name, price);
}
}
}
代码局限:
1>.ArrayList没有提供与其内部内容相关的编译时信息,可以添加任何类型数据。
2>.代码中为属性设置了公共的get方法,则意味着要添加对应的set方法也是公共的。
3>.用于创建属性和变量的代码过于复杂,包括一个私有变量和一个公共方法。
2.C#2.0代码
using System.Collections.Generic;
using System.ComponentModel; namespace Chapter01.CSharp2
{
[Description("Listing 1.02")]
public class Product
{
string name;
public string Name
{
get { return name; }
private set { name = value; }
} decimal price;
public decimal Price
{
get { return price; }
private set { price = value; }
} public Product(string name, decimal price)
{
Name = name;
Price = price;
} public static List<Product> GetSampleProducts()
{
List<Product> list = new List<Product>();
list.Add(new Product("West Side Story", 9.99m));
list.Add(new Product("Assassins", 14.99m));
list.Add(new Product("Frogs", 13.99m));
list.Add(new Product("Sweeney Todd", 10.99m));
return list;
} public override string ToString()
{
return string.Format("{0}: {1}", name, price);
}
}
}
private set{name=value;}
属性可以有公共的get访问器和私有的或者是受保护的set访问器,这有助于控制属性的设置方式。
List<T>强类型集合,可以告知编译器列表中只能包含制定的泛型,试图将一个不同的类型添加到列表中,会造成编译时错误。
3.C#3.0代码
using System.Collections.Generic;
using System.ComponentModel; namespace Chapter01.CSharp3
{
[Description("Listing 1.3")]
class Product
{
public string Name { get; private set; }
public decimal Price { get; private set; } public Product(string name, decimal price)
{
Name = name;
Price = price;
} Product()
{
} public static List<Product> GetSampleProducts()
{
return new List<Product>
{
new Product { Name="West Side Story", Price = 9.99m },
new Product { Name="Assassins", Price=14.99m },
new Product { Name="Frogs", Price=13.99m },
new Product { Name="Sweeney Todd", Price=10.99m}
};
} public override string ToString()
{
return string.Format("{0}: {1}", Name, Price);
}
}
}
自动实现的属性和简化的初始化大大的简化了代码。(Lambda表达式特性操作同样简捷)
硬编码列表不同的构建方式,由于没有name和price变量可供访问,我们必须在类中处处使用属性,这增强了一致性。
4.C#4.0代码
using System.Collections.Generic;
using System.ComponentModel; namespace Chapter01.CSharp4
{
[Description("Listing 1.04 (and more)")]
public class Product
{
readonly string name;
public string Name { get { return name; } } decimal? price;
public decimal? Price { get { return price; } } public Product(string name, decimal? price = null)
{
this.name = name;
this.price = price;
} public static List<Product> GetSampleProducts()
{
List<Product> list = new List<Product>();
list.Add(new Product(name: "West Side Story", price: 9.99m));
list.Add(new Product(name: "Assassins", price: 14.99m));
list.Add(new Product(name: "Frogs", price: 13.99m));
list.Add(new Product(name: "Sweeney Todd", price: 10.99m));
list.Add(new Product(name: "Unpriced"));
return list;
} public override string ToString()
{
return string.Format("{0}: {1}", name, price);
}
}
}
1>.构造函数包含多个参数时,全部使用命名参数,将不再需要记住或查找形参在所调用方法的形参列表中的顺序。
new Product(price: 9.99m,name: "West Side Story")位置相反也可以构造成功。
2>命名实参与位置实参混合时,要么命名实参位于所有位置实参后面,要么部分位置实参要处于正确的形参列表中位置。
概念:命名实参和可选实参。 通过命名实参,你可以为特定形参指定实参,方法是将实参与该形参的名称关联,而不是与形参在形参列表中的位置关联。 通过可选参数,你可以为某些形参省略实参
注意:命名实参、位置实参、可选实参的区别。
总结:
→C#1,只读属性弱类型集合
→C#2,私有属性赋值方法强类型集合
→C#3,自动实现的属性,增强的集合和对象初始化
→C#4,用命名实参更清晰地调用构造函数和方法。
C#语言各个版本特性(一)的更多相关文章
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) C#各版本新特性 C#版本和.NET版本以及VS版本的对应关系
C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) 2017年08月06日 11:53:13 阅读数:6705 历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有1 ...
- C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECM ...
- C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)
历史版本C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECMA ...
- [转]C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECM ...
- C#语言各个版本特性(三)
三.查询集合 1.找出List<Product>列表中符合特定条件的所有元素 C#1.1 查询步骤:循环,if判断,打印 product类 using System.Collections ...
- C#语言各个版本特性(二)
二.排序Product 1.按名称对产品进行排序,以特定顺序显示一个列表的最简单方式就是先将列表排序,再遍历并显示其中的项. C#1.1 使用IComparer对ArrayList进行排序 produ ...
- [转帖]sql server版本特性简介、版本介绍简介
sql server版本特性简介.版本介绍简介 https://www.cnblogs.com/gered/p/10986240.html 目录 1.1.sql server的版本信息 1.2.版本重 ...
- Python 如何移除旧的版本特性,如何迎接新的特性?
2020 年 4 月 20 日,Python 2 的最后一个版本 2.7.18 发布了,这意味着 Python 2 是真正的 EOL(end of life)了,一个时代终于落幕了. Python 2 ...
随机推荐
- c#中变量的作用域
C#中的作用域和javascript中的作用域还是有区别的.呵呵 class Person { /* *确定C#变量作用域的2个规则. 1.类的字段所处的作用域等同于该字段所属类所在的作用域; * 2 ...
- Web Api HelpPage
为了方面APP开发人员,服务端的接口都应当提供详尽的API说明.但每次有修改,既要维护代码,又要维护文档,一旦开发进度紧张,很容易导致代码与文档不一致. Web API有一个Help Page插件,可 ...
- Nginx 是前端工程师的好帮手
Nginx [engine x] 是俄罗斯的 Igor Sysoev 编写的一个 强大的 HTTP 和反向代理服务器,而且也推出了 Windows 版本.Windows 版本使用 select 模型, ...
- ASP.NET中的几种弹出框提示基本实现方法
我们在.NET程序的开发过程中,常常需要和用户进行信息交互,比如执行某项操作是否成功,“确定”还是“取消”,以及选择“确定”或“取消”后是否需要跳转到某个页面等,下面是本人对常用对话框使用的小结,希望 ...
- javascript客户端遍历控件与获取父容器对象
javascript客户端遍历控件与获取父容器对象示例代码 1,遍历也面中所有的控件function findControlAll() { var inputs=document. ...
- 彻底禁止win10更新
关闭win10自动更新: 可以用下面方法关闭: 1.首先在服务界面关闭Windows Update服务并设置为禁用并在恢复界面全部如下图设置为无操作. 2.只关闭了Windows Update服务发现 ...
- 跨域资源共享/option 请求产生原因
https://blog.csdn.net/hfahe/article/details/7730944
- js获取当前项目根路径URL (转自CSDN 红领巾-sunlight)
/** * //获取当前项目根路径 * @return {TypeName} */ function getRootPath(){ //获取当前网址,如: http://localhost:8083/ ...
- Qt Thread
Threading Classes (Qt help manual key words) These Qt Core classes provide threading support to appl ...
- mybatis总结回顾
1.mybatis的介绍 轻量级数据持久层框架,替代hibernate 2.mybatis的入门 导包-->配置文件(类名.xml.SqlMapConfig.xml) 类名.xml:放映射.sq ...