VS2017十五项新功能体验
Visual Studio 2017十五项新功能体验
Visual Studio 2017正式已经于2017.3.7号正式发布,选在这一天发布也是为了纪念Visual Studio 二十周年。MVP 2017技术峰会将于这个周末(3.17)在北京举办,由于正在外地出差不能前往参加很是遗憾。我是从Visual Studio 6一路走过来的一线开发人员,亲历.NET (自2002年接触)开发这15年的变化。从Visual Studio 2003的ASP.NET Form到ASP.NET MVC,最后到AngularJS +Bootstrap,从Windows Forms到WPF。走技术的变更与业务领域结合的路线,一直对.NET开发很有信心。
安装Visual Studio 2017
从微软网站下载安装文件visual_studio_enterprise_2017_x86_x64.exe,只有不到1MB大小。这只是一个引导程序(Web Installer),启动之后勾选需要的组件即可进行安装。
我只勾选了.NET desktop Development和ASP.NET and web development两项,右下角显示需要5.33G磁盘空间。点击Install之后开始安装。
我的电脑配置是i5 6400,128G固态硬盘,安装过程耗费时间约10分钟。安装完成之后需要重启一下电脑。
启动之后如下图所示,看到期待的.NET Core和.NET Standard。J
Visual Studio 2017 新功能
1. Filtered IntelliSense
IntelliSense可以大量节省敲击代码的时间。以往的IntelliSense会根据当前字母所在的上下文自动判断,并查找合适的匹配字符供用户挑选。新版本的加入Filtered特性,下面的几点按钮依次是
- Locals and Parameters – 局部变量
- Constants – 常量
- Properties – 属性
- Fields – 字段
- Methods – 方法
- Interfaces – 接口
- Classes – 类型
- Modules – 模块
- Structures – 结构
- Enums – 枚举
- Namespaces – 命名空间
- Keywords – 关键字
- Snippets – 脚本
点击相应的按钮会过滤IntelliSense的结果,以便更精确的查找需要的数据。
2. Predictive IntelliSense
这一项功能也非常实用,参考下图
当我们在dtReturns.Rows.Add方法的参数中输入值时,它会智能的匹配当前上下文环境中匹配的数据。因为Rows.Add方法的参数接受数组类型或是DataRow,Predictive IntelliSense会找出当前环境中能够匹配此参数类型是的数据项。再参考一个例子:
我们在属性上面输入特性(Attribute),Predictive IntelliSense会根据当前的属性类型提示出StringLength特性。
当我们在在int类型的属性上添加特性时,它提示出MaxLength特性,正好可应用于当前的属性。
3. Find All References
这个特性在ReSharper中早已经存在,Visual Studio终于将它内置进来。
ReSharper的Find All References可以做的更深一点,对于查找所有字段或属性的引用,它将Set或Get分开显示,也就是可以看出有哪些地方是引用变量的值,
有哪些地方是设置变量的值。在大型系统调试变量的值时,这个特性会非常有用。
4. Run-To-Click
这个功能强化了以前的Run to Cursor。以前我们需要点击鼠标右键,选Run to Cursor,现在只需要在相关的行前面,点击小绿色按钮,将可实现将代码运行到此处。
5. Run-To-Click Performance Tips
这个功能第4点属于同一组Enhancement,参考下图:
当我们勾选了Run to Click之后,程序运行到当前行,在当前行的代码之后,会显示<1ms elapsed这样的字样,表示运行到这一句耗费的时间。
6. Open Folder
在Start Page中有一项Open Folder,可用于打开Windows Explorer,点击之后打开默认位置C:\Users\Administrator\Documents\Visual Studio 2017\Projects
7. Installation Nickname
Visual Studio 2017有三个版本Enterprise,Professiona, Community,我们可以在同一台机器中同时安装这三个版本的Visual Studio。在安装时只需要指定不同的别名(Nickname)即可。
这会导致一个扩展插件,需要分别勾选要安装到的Visual Studio版本,如下图所示。
8. Improved Code Navigation
Visual Studio改善Go to All,相比之前的Go To,可以更有效率的找到需要的数据。我们在任意地方敲击Ctrl + ,
Visual Studio 可以帮忙找到文件,类型,符号等匹配项,快速导航到需要的地方。
9. Attach to Process Filter
附加到进程现在支持按进程名称过滤,参考下图。
在可用进程(Available Processes)列表的右上角,有一个带Filter Processes水印的文本框,可以对进程名称过滤。
10. The New Exception Helper
经过改善的异常辅助器如下图所示。
我们点击Edit Conditions可编辑中断条件。
其实还有做的更好的OzCode的Exception Helper,它可以快速帮忙定位到哪里抛出异常(Throw Exception),哪里处理异常(Handle Exception)。在大量系统中查找数据异常非常方便。
11. Live Unit Testing
当跑一次单元测试之后,Visual Studio可以显示代码覆盖率,通过代码行前面的绿色勾或红色叉,可以区别分运行过的代码路径与没有跑的代码路径。
这个功能也不算新鲜,dotCover多年以前就具备这个功能。
12. Redgate Data Tools Included with Visual Studio
Redgate的SQL 工具直接集成到Visual Studio中以辅助快速编写SQL语句和管理与部署数据库。它们分别是
· Redgate ReadyRoll Core, 数据库升级与自动化部署
· Redgate SQL Prompt Core, SQL语句智能提示
· Redgate SQL Search, 数据库搜索
Redgate 开发了大量的.NET开发人员必备的工具,如.NET Reflector,SQL Prompt,dotPerformance。如今直接集成到Visual Studio中变成官方支持版本,可见其相当完善,市场占有率高。
当年Visual Studio集成了水晶报表,让Crystal Report成为报表制作的工业标准。微软之后开发出自己的SQL Server Reporting Services,Crystal Report便不再直接集成在Visual Studio安装包中。
13. TypeScript 2.1
项目中用到AngularJS,JavaScript也是由TypeScript生成。TypeScript是一种设计时语言,最终是为了生成JavaScript,它有强类型语言的特点,配合Visual Studio开发工具,项目中JavaScript代码的可维护性和质量大大提升。
Array 数组类型
TypeScript |
JavaScript |
var array: string[] = ['test', 'dummy']; var first: string = array[0]; |
var array = ['test', 'dummy']; var first = array[0]; |
Primitive 基本类型
TypeScript |
var name = { firstName: 'Homer', lastName: 'Simpson' }; name.firstName = 2; //This gives compile time error |
JavaScript |
var name = { firstName: 'Homer', lastName: 'Simpson' }; name.firstName = 2; //No Error in JavaScript |
Type Inference类型决断
TypeScript |
var dummy; //any type var num = 10; //number var str = 'Hello TypeScript'; //string var bln = true; //boolean var stringArray = ['Homer', 'Simpson']; //string[] |
JavaScript |
var dummy; var num = 10; var str = 'Hello TypeScript'; var bln = true; var stringArray = ['Homer', 'Simpson']; |
TypeScript |
var addFunction = function (n1: number, n2: number, n3: number) { var sum = n1 + n2 + n3; return sum; }; var str1: string = addFunction(10, 20, 30); //Gives compile time error as return type of a function is number and is being assigned to a string var sum: number = addFunction(10, 20, 30); // This works var result = addFunction(10, 20, 30); // This also works |
JavaScript |
var addFunction = function (n1, n2, n3) { var sum = n1 + n2 + n3; return sum; }; var str1 = addFunction(10, 20, 30); var sum = addFunction(10, 20, 30); var result = addFunction(10, 20, 30); |
Optional Type 可选参数
TypeScript |
var addFunction = function (n1: number, n2: number, n3?: number) : number { var sum = n1 + n2 + n3; return sum; }; var sum: number = addFunction(10, 20); |
JavaScript |
var addFunction = function (n1, n2, n3) { var sum = n1 + n2 + n3; return sum; }; var sum = addFunction(10, 20); |
Classes and Interface 类和接口
TypeScript |
class Student { private firstName: string; private lastName: string; yearOfBirth: number; //Public scope by default schoolName: string; city: string; //Constructor constructor(firstName: string, lastName: string, schoolName: string, city: string, yearOfBirth: number) { this.firstName = firstName; this.lastName = lastName; this.yearOfBirth = yearOfBirth; this.city = city; this.schoolName = schoolName; } //Function age() { return 2014 - this.yearOfBirth; } //Function printStudentFullName(): void { alert(this.lastName + ',' + this.firstName); } } |
JavaScript |
var Student = (function () { //Constructor function Student(firstName, lastName, schoolName, city, yearOfBirth) { this.firstName = firstName; this.lastName = lastName; this.yearOfBirth = yearOfBirth; this.city = city; this.schoolName = schoolName; } //Function Student.prototype.age = function () { return 2014 - this.yearOfBirth; }; //Function Student.prototype.printStudentFullName = function () { alert(this.lastName + ',' + this.firstName); }; return Student; })(); |
代码来自于TypeScript - 101 : The Basics,地址是https://www.codeproject.com/Articles/802722/TypeScript-The-Basics
14. Quick Actions and Refactorings
代码重构。这项功能早就集成在Resharper中。
这一功能可以将对象的赋值语句块转化为对象初始化写法。
out内联
空值检查
15. Chrome Debugging Support
Visual Studio可以调试运行在Chrome中的JavaScript脚本。也可以调试由TypeScript生成的JavaScript脚本。在Chrome中启动调试时,只需要在相应的脚本文件中放入
Debugger中断,再启动Chrome的调试模式,Chrome会在代码执行到debugger时中断,此时可单步调用TypeScript文件。
VS2017十五项新功能体验的更多相关文章
- Visual Studio 2017十五项新功能体验
Visual Studio 2017正式已经于2017.3.7号正式发布,选在这一天发布也是为了纪念Visual Studio 二十周年.MVP 2017技术峰会将于这个周末(3.17)在北京举办,由 ...
- 地图SDK全面升级 – 数十项新功能及优化等你来体验
腾讯位置服务地图SDK是一套提供多种地理位置服务的应用程序接口.通过调用该接口,开发者可以在自己的应用中加入地图相关的功能(如地图展示.标注.绘制图形等),轻松访问腾讯地图服务和数据,构建功能丰富.交 ...
- 十五项指标衡量DevOps是否成功
DevOps在你的组织内部运行的如何?如果你需要一些帮助来度量它的运行情况,我们已经准备了一个用于跟踪的关键DevOps指标的列表,这些度量可以帮助了解你的团队是如何随着时间的推移而运行的. 在团队内 ...
- 最新版Swagger 3升级指南和新功能体验!
Swagger 3.0 发布已经有一段时间了,它于 2020.7 月 发布,但目前市面上使用的主流版本还是 Swagger 2.X 版本和少量的 1.X 版本,然而作为一名合格的程序员怎么能不折腾新技 ...
- 第十五章 提升用户体验 之 设计实现MVC controllers 和 actions
1. 概述 controllers 和 actions 是 ASP.NET MVC4中非常重要的组成部分. controller管理用户和程序间的交互,使用action作为完成任务的方式. 如果是包含 ...
- 潭州课堂25班:Ph201805201 django 项目 第十五课 用户注册功能后台实现 (课堂笔记)
前台:判断用户输入 ,确认密码,手机号, 一切通过后向后台发送请求, 请求方式:post 在 suers 应用下的视图中: 1,创建个类, 2,创建 GET 方法,宣言页面 3,创建 POST 方法 ...
- 二十五种网页加速方法和seo优化技巧
一.使用良好的结构 可扩展 HTML (XHTML) 具有许多优势,但是其缺点也很明显.XHTML 可能使您的页面更加符合标准,但是它大量使用标记(强制性的 <start> 和 <e ...
- ActiveReports 9 新功能:借助目录(TOC)控件为报表添加目录功能
在最新发布的ActiveReports 9报表控件中添加了多项新功能,以帮助你在更短的时间里创建外观绚丽.功能强大的报表系统,本文将重点介绍新增文档目录控件(TOC),通过拖拽操作便可添加报表目录. ...
- iOS10 新特性-新功能,以及ReplayKit库
iOS的10.0 本文总结了iOS的10,运行于目前推出iOS设备推出的主要开发者相关的功能. iOS版10引入了新的方法来增加您的应用程序通过帮助系统参与在适当的时候建议你的应用程序给用户.如果你在 ...
随机推荐
- 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers
[链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...
- WebApi自定义返回类型和命名空间实现
1.自定义ContentNegotiator /// <summary> /// 返回json的ContentNegotiator /// </summary> public ...
- [Node] Run Any Version of a Node Tool with npx
As node projects evolve, new features are added all the time. This results in different errors or re ...
- 链表(三)——链表删除冗余结点&插入结点到有序链表
1.一个以递增方式排列的链表,去掉链表中的冗余值. 思路一:设有两个指针p和q.使p不动,q依次往后循环直到p->data不等于q->data,再将中间的冗余数据删除. 思路二:设有两个指 ...
- 12.1、USB驱动——描述符、URB、管道
大家常说,一个设备通常有多个配置,配置通常有多个接口,接口通常有多个端点.接口代表逻辑上的设备,比如声卡分为 录音和播放.访问设备时,访问的是某个接口(逻辑设备).除了端点0之外,每个端点只支持一个传 ...
- 一位90后程序员的自述:如何从年薪3w到30w!
初入职场之时,大多数人都应该考虑过这样的一个问题,如何找到一种实用,简化web流程的方法,在工作之中能有所提升和突破. 学好哪些?基础必须精通! 九层之塔,起于垒土;千里之行,始于足下.入门之前,这些 ...
- 大数据(十四) - Storm
storm是一个分布式实时计算引擎 storm/Jstorm的安装.配置.启动差点儿一模一样 storm是twitter开源的 storm的特点 storm支持热部署,即时上限或下线app 能够在st ...
- [Pug] Template Engine -- Jade/ Pug
Looking at the follow code: .wrapper - const upName = name && name.toUpperCase(); h2 | Hello ...
- Vue.js如何划分组件
常见的一些页面,大家坐在一起敲代码就可以了,做完这个页面再做别的页面,但是作为一个功能复杂的系统,尤其是使用一些适合模块化开发的框架,这样会显得效率很低,那么我们就单纯的看在Vue里面如何划分组件的. ...
- AVR第5课:蜂鸣器
下面是蜂鸣器的电路图. 代码:蜂鸣器代码. <span style="font-size:18px;">/* *info:buzzer *author:chenlu * ...