LINQPad,我的C#/.NET学习诀窍
LINQPad,我的C#/.NET学习诀窍
在我以往的文章中,尤其涉及代码演示的,都使用了同一个工具——LINQPad
。但许多客户面对我分享的.linq
源文件都迷茫不知所措,因此有必要来聊聊一下这个强大的工具。
本文首先将对该工具做个简单的介绍,并且分享一些LINQPad
的优点,并同时分享一些周边替代工具以及它们的优缺点。
LINQPad是什么?
在LINQPad
官网 https://www.linqpad.net/ 中,介绍的副标题说LINQPad
是.NET
开发者的操练场。它提供了:
- 简约的代码编辑界面
- 不到
20MB
的体积——超轻量级 - 强大的格式化输出,不管你是输出文字、表格、还是动态数据
- 支持多种数据库等
LINQPad
现在最新版本是6.14.4
,但马上将要发布V7
,到时候将支持.NET 6
和.NET 7
。
LINQPad
作者是Joseph Albahari
,我刚好手头就有他的一本《C# 7.0
核心技术指南》,可见该大佬不仅开发能力一流,还有热忱的知识分享能力,非常令人敬佩。
除此之外,它还如其名,LINQ
,表示它也可以连接数据库,因此你也可以用它来做一个数据库管理工具。
有朋友告诉我LINQPad
取了一个不好的名字,因为LINQ
听起来像是只能查数据库、玩LINQ
,但这不是事实。虽然LINQPad
确实能查数据库,但它更擅长的是做一些C#/.NET
快速脚本与POC
的工作。——也许我觉得它应该叫.NET Pad
能更符合它的功能定位 。
LINQPad的优点
快速POC
POC
是指概念验证,比如开发过程中遇到以下这类情况:
Dictionary
使用.Add()
添加相同的key
,是否会报错?(会)- 数组形式的
JToken
,转字符串数组string[]
应该用强转?还是用.ToArray<string>()
?还是.ToObject<string[]>()
? ASP.NET Core
获取远程IPv6
地址,使用Connection.RemoteIpAddress
是否可行?(可行)Newtonsoft.Json
与System.Text.Json
相比,反序列化性能哪个好?耗时、内存分配各相差多少倍?(…)
面对这些问题,下意识地会想必须要做实验——不然到了测试时甚至生产环境时才暴露出来就太迟了。而做实验就要写代码——而这个做实验的过程,就叫POC
——Proof of Concept
。
经常写代码的开发者应该知道,开发过程中有时会特别需要做一下这种快速POC
。如果全部按部就班地在Visual Studio
中创建项目、添加引用,然后调试等,势必会花费许多时间。但如果用LINQPad
,打开后马上就可以写代码,完成一个快速的POC
,可能只需不到60
秒。这一点是我认为LINQPad
的主要优点,是其它开发类产品难以比拟的优秀领域。
快速分享
如果有其它同事有一些简单的需求,如做一些数据的ETL
,我们可能会有如下几种选择:
- 给他一个二进制可执行文件,但它无法了解里面的运行细节
- 给他一个源代码,但代码往往是一个压缩包,因为依赖包含在
.csproj
中,而且需要编译 node.js
或python
脚本不需编译即可运行,但依赖也要定义在package.json
中,不方便
综上几方面,LINQPad
的源文件文件.linq
就脱颖而出了,它可以像node.js
、python
那样不需单独的编译过程、也能了解代码的运行细节,不管对分发者和接受者都很方便。
这是一个.linq
文件的示例:
<Query Kind="Statements">
<NuGetReference>Newtonsoft.Json</NuGetReference>
<Namespace>System.Net.Http</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
</Query>
using var http = new HttpClient();
string url = "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=5&mkt=zh-cn";
string json = await http.GetStringAsync(url);
JToken.Parse(json)["images"].Select(x => (string)x["url"]).Dump();
LINQPad
的命令行工具叫lprun6
,这是针对.NET Core
的,另外还有单独针对.NET Framework
的,叫lprun
,运行示例:
管理功能
也许您可能不会信,但LINQPad
的输出界面不仅是一个文字展示区,还是一个功能交互区,甚至还能做一些管理功能。因为它集成了一个浏览器组件。LINQPad
内置了许多控件,如按钮、文本框等,虽然不至于多美观,但对程序员来说够用。
如上图,我做了一个微服务网关kong
的服务管理小程序,通过该程序我可以轻松以可视化的方式管理我的微服务端点与路由,比较方便——而左边的源代码,可以让我轻松地了解这个程序工作的细节并扩展功能。
而这样的小程序只需花少量代码即可完成,完成后可以立即发给同事复用,效率很高。我的工作和生活中写了许多这样的小程序,比如:
- 公司的私有
NuGet
包版本展示、升级管理工具 - 阿里云
DNS
信息展示、编辑工具 OpenWrt
节点展示、快速切换工具- 产品不同环境选择、免密码一键登录工具
- 客户网站信息展示、一键生成报表工具
等等,朋友们要是有兴趣,以后我可以再深入这些细节。
其它优点
除此之外,LINQPad
还有一些经久耐用的好功能,这里我很难一次性对其一一介绍清楚,但我至少能列一个目录,如:
- 内置的正则表达式验证工具
- 内置的数据库连接功能
- 提供了
Util.GetPassword()
,满足“敏感信息不进版本控制”的强制安全性要求 - 提供了
#load "..."
,脚本之间可以互相依赖 - 提供了快速导出
Excel
/Word
/HTML
的功能
另外,公司产品有时需要用Postman
来描述API
的接口、参数与使用方法,有了LINQPad
我觉得甚至可以替代Postman
完成它的功能。
我甚至用LINQPad
做过一些游戏,如2048
,打砖块:
替代品
Visual Studio
严格说它不应该成为LINQPad
的替代品,但大家电脑上都装了这个,而且免费、提供了更更大的智能提示、重构等功能。但如果严格用来比较,我认为Visual Studio
做POC
的主要缺点是启动慢,可能需要等8
秒左右才能从冷启动到可响应,然后还要花另外12
秒创建一个项目,然后才开始写代码。而有时灵感来了就那么几秒的事情,20
秒左右的时间已经完全可以完成一个概念验证。
RoslynPad
这款可能是LINQPad
的“政治正确”型的对手。它完全免费,而且跨平台——能在Mac
、Linux
上运行(跨平台UI
组件是Avalonia
)。它还是完全开源项目:https://github.com/aelij/RoslynPad ,你甚至可以把它代码下载过来随时自己编译一个——编译只需安装Visual Studio
,然后按Ctrl+F5
即可编译并运行。而且它支持.csx
——基于C#
的脚本语言,这种语言其实比.linq
更流行一些,毕竟只要安装.NET SDK
就能在服务器上运行。
至于它的缺点,最主要的是功能单一,以下我列个图表比较RoslynPad
和LINQPad
的功能:
功能 | LINQPad | RoslynPad |
---|---|---|
智能提示 | ||
NuGet 包安装 |
||
脚本化运行 | ||
支持.NET Core | ||
跨平台 | ||
开源 | ||
完全版免费 | ||
VB 、F# 支持 |
||
丰富的快捷键 | ||
ILSpy 反编译 |
||
图表功能 | ||
富媒体输出 | ||
表格输出 | ||
不换行输出 | ||
JToken 感知输出 |
||
数据库连接 |
综上,RoslynPad
算是低配版的LINQPad
,我推荐不想买LINQPad
高级版的朋友,使用这个工具。
Xamarin Workbooks
这个工具仿照的是Jupyter Notebook
,后者现在其实已经运行了C#/.NET
,也支持的是.csx
脚本。这个工具在输出时相比RoslynPad
有一定优势,但我之前试用发现有一些bug
,比如有时界面会卡住不能操作。
但其实写文档和做快速POC
其实是两码事,就算是做文档,代码的部分其实也不多,因此这类工具定位与我的需求有差异。
价格
首先聊它的免费版,免费版的LINQPad
提供了完整的代码功能、数据库连接功能和命令行功能,但限制了智能提示,也不能安装NuGet
包。我想对大多数人来说,智能提示的缺失很致命。
在我真正购买正版授权之前,我花了约一个月的时候完全使用免费版,因为我觉得这个工具的最佳的优点在于做超快速的POC
——这一点是任何其它工具都做不到的。因此我认为就算是免费版,也有它不可或缺的意义。(另外可能还有一个小小的原因是,我常常训练自己尽量不依赖IDE
提示写代码)
然后是它的价格如它图,带所有高级功能的高级版售价115
美元。按今天的汇率折合人民币约774.395
元,现在买送LINQPad 7
的授权。对想买个软件的人来说,不便宜,但主要看你怎么理解这个数字。对我来说,它提供的高效POC
的功能,给我提供一次“编程革命”,现在也是我每天敲代码乐趣的主要源泉。从这两个角度来说,我花得很值。
另外还有一些“不可言说”的事情,好用的东西网上必然也能找到一些破解版,这无疑为不愿花钱的朋友提供了福音。但它有几大缺点:
- 版本号固定,因此不能享受最新的功能(如
Edge Chroumiun
渲染引擎) - 需要想办法禁用自动更新,因为更新后破解就消失了
- 某些破解会夹带私货,如安装木马或挖矿软件
- 找过的都知道,找破解本身就是一件痛苦的事,提供破解的网站往往很绕
基于这些原因,以及我还希望LINQPad
作者能有动力持续开发、更新这样富有创造力的软件,我强烈建议支持正版。
但如果一定想要,我可以提供一个方向,点击显示
使用任意搜索引擎搜索“LINQPad Premium 6.13.13 Crack
”。
总结与展望
本文大致介绍了LINQPad
的强大功能,以及我与LINQPad
的一些缘分/背景。
说来LINQPad
也不是没有缺点,它网上有个论坛,我经常会在上面提一些需求或bug
,作者经常解决得很快。
一直以来另一个很困扰客户的问题是.linq
脚本如何移植到Visual Studio
中当作普通的C#
程序运行。虽然我完全看不出这有任何困难,但稍后有机会我会深入聊聊这些LINQPad
功能如何移植。
最后,我要声明:我没有收LINQPad
一分钱。相关实体请给我打钱
喜欢的朋友 请关注我的微信公众号:【DotNet骚操作】
LINQPad,我的C#/.NET学习诀窍的更多相关文章
- ASP.NET EF 使用LinqPad 快速学习Linq
使用LinqPad这个工具可以很快学习并掌握linq[Language Integrated Query] linqPad官方下载地址:http://www.linqpad.net/ linqPad4 ...
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...
- LinqPad工具:帮你快速学习Linq
LinqPad工具:帮你快速学习Linq 参考: http://www.cnblogs.com/li-peng/p/3441729.html ★:linqPad下载地址:http://www.linq ...
- 用linqPad帮助你快速学习LINQ
在这里我向大家推荐的一个具是LinqPad有了这个工具并熟练使用就可以很快学习并掌握linq linqPad下载地址:http://www.linqpad.net/ 它也自带了很多例子方便大家查询,l ...
- linqPad快速学习LINQ(含视频)
在这里我向大家推荐的一个具是LinqPad有了这个工具并熟练使用就可以很快学习并掌握linq 安装步骤: 使用LINQPad可以很方便的调试linq以及lambda表达式.其中自带了linq以及F#简 ...
- 学习LINQ,发现一个好的工具。LINQPad!!
今日学习LINQ,发现一个好的工具.LINQPad!! 此工具的好处在于,不需要在程序内执行,直接只用工具测试.然后代码通过即可,速度快,简洁方便. 可以生成其LINQ查询对应的lambda和SQL语 ...
- 使用 LINQPad 助力 LINQ 学习
简介一图示意 简介 LINQPad 是一款学习 LINQ,优化 SQL 的好助手. 它的一大特点是内置了新版<C# in a Nutshell>的全部 LINQ 示例,不管是配合原书进行练 ...
- linqPad帮助你快速学习LINQ
linqPad http://www.cnblogs.com/li-peng/p/3441729.html http://www.linqpad.net/ Linqer http://www.sqlt ...
- 【转载学习前辈的经验】-- Mistakes I made (as a developer) 我(作为一名开发者)所犯过的错误
我 2006 年开始工作,至今已经 10 年.10 年是个里程碑,我开始回顾自己曾经犯过的错误,以及我希望从同行那里得到什么类型的忠告.一切都在快速改变,10 年了,我不能确定这些秘诀是否还有用. 不 ...
随机推荐
- Mybatis初步认识
分三层 第一章 1.三层架构 界面层:和用户打交道,接收用户的请求参数明显是处理结果的(jsp,html,servlet) 业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据 数据访问 ...
- 测试成长记录:python调adb无法获取设备信息bug记录
背景介绍: 一直在负责公司Android自动化的编写工作,采用的是uiautomator2,需要获取设备id来连接设备,就是 adb devices 问题描述: 之前一直用 subprocess.ch ...
- Numpy的终极备忘录
转: Numpy的终极备忘录 作者|Rashida Nasrin Sucky编译|VK来源|Towards Data Science Python是开源的.对于使用python的数据科学家来说,Num ...
- C#连接Excel读取与写入数据库SQL ( 下 )
接上期 dataset简而言之可以理解为 虚拟的 数据库或是Excel文件.而dataset里的datatable 可以理解为数据库中的table活着Excel里的sheet(Excel里面不是可以新 ...
- 《从零开始TypeScript》系列 - 基础数据类型
TypeScript 是 JavaScript 的超集,这里我们只讨论两者中的不同的部分,或者需要注意的部分 数组 Array:在TypeScript中,有两种方式来定义一个数组: 在元素类型后面接上 ...
- [GXYCTF2019]Ping Ping Ping 1
进入界面 根据提示进行ping信号 看到网页的内容就想到经典的Linux命令执行,使用命令执行的管道符 " | "尝试列出文件 FLAG应该在Flag.php里面 构造play ...
- 2020年12月-第02阶段-前端基础-Day06
CSS Day06 定位(position) 理解 能说出为什么要用定位 能说出定位的4种分类 能说出四种定位的各自特点 能说出我们为什么常用子绝父相布局 应用 能写出淘宝轮播图布局 1. CSS 布 ...
- JVM 中的异常
StackOverflowError 在 JVM 的栈中,如果线程要创建的栈帧大小大于栈容量的大小时,就会抛出 java.lang.StackOverflowError.比如下面的代码 public ...
- 手把手教你集成华为机器学习服务(ML Kit)人脸检测功能
当给自己拍一张美美的自拍照时,却发现照片中自己的脸不够瘦.眼睛不够大.表情不够丰富可爱-如果此时能够一键美颜瘦脸并且添加可爱的贴纸的话,是不是很棒? 当家里的小孩观看iPad屏幕时间过长或者眼睛离屏幕 ...
- mongodb导入,导出实例
MongoDB中文手册|官方文档中文版 英文版:https://docs.mongodb.com/manual/ 1.mongoexport 导出文件 打开命令行,进入我们所安装的mongodb路径下 ...