爱一生的人 發表於 2021-5-6 08:58:00

LINQPad,我的C#/.NET学习诀窍

<h1 id="linqpad我的cnet学习诀窍">LINQPad,我的C#/.NET学习诀窍</h1>
<p>在我以往的文章中,尤其涉及代码演示的,都使用了同一个工具——<code>LINQPad</code>。但许多客户面对我分享的<code>.linq</code>源文件都迷茫不知所措,因此有必要来聊聊一下这个强大的工具。<br>
<img src="https://img2020.cnblogs.com/blog/233608/202105/233608-20210505222348496-1040431851.png" alt="" loading="lazy"></p>
<p>本文首先将对该工具做个简单的介绍,并且分享一些<code>LINQPad</code>的优点,并同时分享一些周边替代工具以及它们的优缺点。</p>
<h2 id="linqpad是什么">LINQPad是什么?</h2>
<p>在<code>LINQPad</code>官网 https://www.linqpad.net/ 中,介绍的副标题说<code>LINQPad</code>是<code>.NET</code>开发者的操练场。它提供了:</p>
<ul>
<li>简约的代码编辑界面</li>
<li>不到<code>20MB</code>的体积——超轻量级</li>
<li>强大的格式化输出,不管你是输出文字、表格、还是动态数据</li>
<li>支持多种数据库等</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/233608/202105/233608-20210505222415926-1535292178.png" alt="" loading="lazy"></p>
<p><code>LINQPad</code>现在最新版本是<code>6.14.4</code>,但马上将要发布<code>V7</code>,到时候将支持<code>.NET 6</code>和<code>.NET 7</code>。</p>
<p><code>LINQPad</code>作者是<code>Joseph Albahari</code>,我刚好手头就有他的一本《<code>C# 7.0</code>核心技术指南》,可见该大佬不仅开发能力一流,还有热忱的知识分享能力,非常令人敬佩。<br>
<img src="https://img2020.cnblogs.com/blog/233608/202105/233608-20210505222438475-1780998832.jpg" alt="" loading="lazy"></p>
<p>除此之外,它还如其名,<code>LINQ</code>,表示它也可以连接数据库,因此你也可以用它来做一个数据库管理工具。</p>
<p><em>有朋友告诉我<code>LINQPad</code>取了一个不好的名字,因为<code>LINQ</code>听起来像是只能查数据库、玩<code>LINQ</code>,但这不是事实。虽然<code>LINQPad</code>确实能查数据库,但它更擅长的是做一些<code>C#/.NET</code>快速脚本与<code>POC</code>的工作。——也许我觉得它应该叫<code>.NET Pad</code>能更符合它的功能定位 。</em></p>
<h2 id="linqpad的优点">LINQPad的优点</h2>
<h3 id="快速poc">快速POC</h3>
<p><code>POC</code>是指概念验证,比如开发过程中遇到以下这类情况:</p>
<ul>
<li><code>Dictionary</code>使用<code>.Add()</code>添加相同的<code>key</code>,是否会报错?(会)</li>
<li>数组形式的<code>JToken</code>,转字符串数组<code>string[]</code>应该用强转?还是用<code>.ToArray&lt;string&gt;()</code>?还是<code>.ToObject&lt;string[]&gt;()</code>?</li>
<li><code>ASP.NET Core</code>获取远程<code>IPv6</code>地址,使用<code>Connection.RemoteIpAddress</code>是否可行?(可行)</li>
<li><code>Newtonsoft.Json</code>与<code>System.Text.Json</code>相比,反序列化性能哪个好?耗时、内存分配各相差多少倍?(…)</li>
</ul>
<p>面对这些问题,下意识地会想必须要做实验——不然到了测试时甚至生产环境时才暴露出来就太迟了。而做实验就要写代码——而这个做实验的过程,就叫<code>POC</code>——<code>Proof of Concept</code>。</p>
<p>经常写代码的开发者应该知道,开发过程中有时会特别需要做一下这种快速<code>POC</code>。如果全部按部就班地在<code>Visual Studio</code>中创建项目、添加引用,然后调试等,势必会花费许多时间。但如果用<code>LINQPad</code>,打开后马上就可以写代码,完成一个快速的<code>POC</code>,可能只需不到<code>60</code>秒。这一点是我认为<code>LINQPad</code>的主要优点,是其它开发类产品难以比拟的优秀领域。</p>
<p><img src="https://img2020.cnblogs.com/blog/233608/202105/233608-20210505222451888-270585602.png" alt="" loading="lazy"></p>
<h3 id="快速分享">快速分享</h3>
<p>如果有其它同事有一些简单的需求,如做一些数据的<code>ETL</code>,我们可能会有如下几种选择:</p>
<ul>
<li>给他一个二进制可执行文件,但它无法了解里面的运行细节</li>
<li>给他一个源代码,但代码往往是一个压缩包,因为依赖包含在<code>.csproj</code>中,而且需要编译</li>
<li><code>node.js</code>或<code>python</code>脚本不需编译即可运行,但依赖也要定义在<code>package.json</code>中,不方便</li>
</ul>
<p>综上几方面,<code>LINQPad</code>的源文件文件<code>.linq</code>就脱颖而出了,它可以像<code>node.js</code>、<code>python</code>那样不需单独的编译过程、也能了解代码的运行细节,不管对分发者和接受者都很方便。</p>
<p>这是一个<code>.linq</code>文件的示例:</p>
<pre><code class="language-cs">&lt;Query Kind="Statements"&gt;
&lt;NuGetReference&gt;Newtonsoft.Json&lt;/NuGetReference&gt;
&lt;Namespace&gt;System.Net.Http&lt;/Namespace&gt;
&lt;Namespace&gt;Newtonsoft.Json.Linq&lt;/Namespace&gt;
&lt;/Query&gt;

using var http = new HttpClient();
string url = "https://www.bing.com/HPImageArchive.aspx?format=js&amp;idx=0&amp;n=5&amp;mkt=zh-cn";
string json = await http.GetStringAsync(url);
JToken.Parse(json)["images"].Select(x =&gt; (string)x["url"]).Dump();
</code></pre>
<p><code>LINQPad</code>的命令行工具叫<code>lprun6</code>,这是针对<code>.NET Core</code>的,另外还有单独针对<code>.NET Framework</code>的,叫<code>lprun</code>,运行示例:<br>
<img src="https://img2020.cnblogs.com/blog/233608/202105/233608-20210505222506214-1427212927.png" alt="" loading="lazy"></p>
<h3 id="管理功能">管理功能</h3>
<p>也许您可能不会信,但<code>LINQPad</code>的输出界面不仅是一个文字展示区,还是一个功能交互区,甚至还能做一些管理功能。因为它集成了一个浏览器组件。<code>LINQPad</code>内置了许多控件,如按钮、文本框等,虽然不至于多美观,但对程序员来说够用。</p>
<p><img src="https://img2020.cnblogs.com/blog/233608/202105/233608-20210505222519021-1264367462.png" alt="" loading="lazy"></p>
<p>如上图,我做了一个微服务网关<code>kong</code>的服务管理小程序,通过该程序我可以轻松以可视化的方式管理我的微服务端点与路由,比较方便——而左边的源代码,可以让我轻松地了解这个程序工作的细节并扩展功能。</p>
<p>而这样的小程序只需花少量代码即可完成,完成后可以立即发给同事复用,效率很高。我的工作和生活中写了许多这样的小程序,比如:</p>
<ul>
<li>公司的私有<code>NuGet</code>包版本展示、升级管理工具</li>
<li>阿里云<code>DNS</code>信息展示、编辑工具</li>
<li><code>OpenWrt</code>节点展示、快速切换工具</li>
<li>产品不同环境选择、免密码一键登录工具</li>
<li>客户网站信息展示、一键生成报表工具</li>
</ul>
<p>等等,朋友们要是有兴趣,以后我可以再深入这些细节。</p>
<h3 id="其它优点">其它优点</h3>
<p>除此之外,<code>LINQPad</code>还有一些经久耐用的好功能,这里我很难一次性对其一一介绍清楚,但我至少能列一个目录,如:</p>
<ul>
<li>内置的正则表达式验证工具</li>
<li>内置的数据库连接功能</li>
<li>提供了<code>Util.GetPassword()</code>,满足“<strong>敏感信息不进版本控制</strong>”的强制安全性要求</li>
<li>提供了<code>#load "..."</code>,脚本之间可以互相依赖</li>
<li>提供了快速导出<code>Excel</code>/<code>Word</code>/<code>HTML</code>的功能</li>
</ul>
<p>另外,公司产品有时需要用<code>Postman</code>来描述<code>API</code>的接口、参数与使用方法,有了<code>LINQPad</code>我觉得甚至可以替代<code>Postman</code>完成它的功能。</p>
<p>我甚至用<code>LINQPad</code>做过一些游戏,如<code>2048</code>,打砖块:<br>
<img src="https://img2020.cnblogs.com/blog/233608/202105/233608-20210505222532864-581580978.png" alt="" loading="lazy"></p>
<h2 id="替代品">替代品</h2>
<h3 id="visual-studio">Visual Studio</h3>
<p>严格说它不应该成为<code>LINQPad</code>的替代品,但大家电脑上都装了这个,而且免费、提供了更更大的智能提示、重构等功能。但如果严格用来比较,我认为<code>Visual Studio</code>做<code>POC</code>的主要缺点是启动慢,可能需要等<code>8</code>秒左右才能从冷启动到可响应,然后还要花另外<code>12</code>秒创建一个项目,然后才开始写代码。而有时灵感来了就那么几秒的事情,<code>20</code>秒左右的时间已经完全可以完成一个概念验证。</p>
<h3 id="roslynpad">RoslynPad</h3>
<p>这款可能是<code>LINQPad</code>的“政治正确”型的对手。它完全免费,而且跨平台——能在<code>Mac</code>、<code>Linux</code>上运行(跨平台<code>UI</code>组件是<code>Avalonia</code>)。它还是完全开源项目:https://github.com/aelij/RoslynPad ,你甚至可以把它代码下载过来随时自己编译一个——编译只需安装<code>Visual Studio</code>,然后按<code>Ctrl+F5</code>即可编译并运行。而且它支持<code>.csx</code>——基于<code>C#</code>的脚本语言,这种语言其实比<code>.linq</code>更流行一些,毕竟只要安装<code>.NET SDK</code>就能在服务器上运行。</p>
<p><img src="https://img2020.cnblogs.com/blog/233608/202105/233608-20210505222549346-1145422537.png" alt="" loading="lazy"></p>
<p>至于它的缺点,最主要的是功能单一,以下我列个图表比较<code>RoslynPad</code>和<code>LINQPad</code>的功能:</p>
<table>
<thead>
<tr>
<th>功能</th>
<th>LINQPad</th>
<th>RoslynPad</th>
</tr>
</thead>
<tbody>
<tr>
<td>智能提示</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td><code>NuGet</code>包安装</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>脚本化运行</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>支持.NET Core</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>跨平台</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>开源</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>完全版免费</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td><code>VB</code>、<code>F#</code>支持</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>丰富的快捷键</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td><code>ILSpy</code>反编译</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>图表功能</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>富媒体输出</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>表格输出</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>不换行输出</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td><code>JToken</code>感知输出</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>数据库连接</td>
<td>✅</td>
<td>❌</td>
</tr>
</tbody>
</table>
<p>综上,<code>RoslynPad</code>算是低配版的<code>LINQPad</code>,我推荐不想买<code>LINQPad</code>高级版的朋友,使用这个工具。</p>
<h3 id="xamarin-workbooks">Xamarin Workbooks</h3>
<p>这个工具仿照的是<code>Jupyter Notebook</code>,后者现在其实已经运行了<code>C#/.NET</code>,也支持的是<code>.csx</code>脚本。这个工具在输出时相比<code>RoslynPad</code>有一定优势,但我之前试用发现有一些<code>bug</code>,比如有时界面会卡住不能操作。</p>
<p>但其实写文档和做快速<code>POC</code>其实是两码事,就算是做文档,代码的部分其实也不多,因此这类工具定位与我的需求有差异。</p>
<h2 id="价格">价格</h2>
<p>首先聊它的免费版,免费版的<code>LINQPad</code>提供了完整的代码功能、数据库连接功能和命令行功能,但限制了智能提示,也不能安装<code>NuGet</code>包。我想对大多数人来说,智能提示的缺失很致命。</p>
<p>在我真正购买正版授权之前,我花了约一个月的时候完全使用免费版,因为我觉得这个工具的最佳的优点在于做超快速的<code>POC</code>——这一点是任何其它工具都做不到的。因此我认为就算是免费版,也有它不可或缺的意义。(另外可能还有一个小小的原因是,我常常训练自己尽量不依赖<code>IDE</code>提示写代码😁)</p>
<p>然后是它的价格如它图,带所有高级功能的高级版售价<code>115</code>美元。按今天的汇率折合人民币约<code>774.395</code>元,现在买送<code>LINQPad 7</code>的授权。对想买个软件的人来说,不便宜,但主要看你怎么理解这个数字。对我来说,它提供的高效<code>POC</code>的功能,给我提供一次“编程革命”,现在也是我每天敲代码乐趣的主要源泉。从这两个角度来说,我花得很值。<br>
<img src="https://img2020.cnblogs.com/blog/233608/202105/233608-20210505222603525-467428317.png" alt="" loading="lazy"></p>
<p>另外还有一些“不可言说”的事情,好用的东西网上必然也能找到一些<strong>破解版</strong>,这无疑为不愿花钱的朋友提供了福音。但它有几大缺点:</p>
<ul>
<li>版本号固定,因此不能享受最新的功能(如<code>Edge Chroumiun</code>渲染引擎)</li>
<li>需要想办法禁用自动更新,因为更新后破解就消失了</li>
<li>某些破解会夹带私货,如安装木马或挖矿软件</li>
<li>找过的都知道,找破解本身就是一件痛苦的事,提供破解的网站往往很绕</li>
</ul>
<p>基于这些原因,以及我还希望<code>LINQPad</code>作者能有动力持续开发、更新这样富有创造力的软件,我强烈建议支持正版。</p>
<details>
<summary>但如果一定想要,我可以提供一个方向,点击显示</summary>
<p>使用任意搜索引擎搜索“<code>LINQPad Premium 6.13.13 Crack</code>”。</p>
</details>
<h2 id="总结与展望">总结与展望</h2>
<p>本文大致介绍了<code>LINQPad</code>的强大功能,以及我与<code>LINQPad</code>的一些缘分/背景。</p>
<p>说来<code>LINQPad</code>也不是没有缺点,它网上有个论坛,我经常会在上面提一些需求或<code>bug</code>,作者经常解决得很快。</p>
<p>一直以来另一个很困扰客户的问题是<code>.linq</code>脚本如何移植到<code>Visual Studio</code>中当作普通的<code>C#</code>程序运行。虽然我完全看不出这有任何困难,但稍后有机会我会深入聊聊这些<code>LINQPad</code>功能如何移植。</p>
<p>最后,我要声明:我没有收<code>LINQPad</code>一分钱。<s>相关实体请给我打钱😀</s></p>
<p>喜欢的朋友 请关注我的微信公众号:【DotNet骚操作】</p>
<p><img src="https://img2018.cnblogs.com/blog/233608/201908/233608-20190825165420518-990227633.jpg" alt="DotNet骚操作" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/sdcb/p/20210504-linqpad.html
頁: [1]
查看完整版本: LINQPad,我的C#/.NET学习诀窍