首页 > 编程语言 >LINQPad,我的C#/.NET学习诀窍

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

时间:2024-10-18 10:34:59浏览次数:1  
标签:功能 C# 代码 LINQPad NET POC

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.JsonSystem.Text.Json相比,反序列化性能哪个好?耗时、内存分配各相差多少倍?(…)

面对这些问题,下意识地会想必须要做实验——不然到了测试时甚至生产环境时才暴露出来就太迟了。而做实验就要写代码——而这个做实验的过程,就叫POC——Proof of Concept

经常写代码的开发者应该知道,开发过程中有时会特别需要做一下这种快速POC。如果全部按部就班地在Visual Studio中创建项目、添加引用,然后调试等,势必会花费许多时间。但如果用LINQPad,打开后马上就可以写代码,完成一个快速的POC,可能只需不到60秒。这一点是我认为LINQPad的主要优点,是其它开发类产品难以比拟的优秀领域。

快速分享

如果有其它同事有一些简单的需求,如做一些数据的ETL,我们可能会有如下几种选择:

  • 给他一个二进制可执行文件,但它无法了解里面的运行细节
  • 给他一个源代码,但代码往往是一个压缩包,因为依赖包含在.csproj中,而且需要编译
  • node.jspython脚本不需编译即可运行,但依赖也要定义在package.json中,不方便

综上几方面,LINQPad的源文件文件.linq就脱颖而出了,它可以像node.jspython那样不需单独的编译过程、也能了解代码的运行细节,不管对分发者和接受者都很方便。

这是一个.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 StudioPOC的主要缺点是启动慢,可能需要等8秒左右才能从冷启动到可响应,然后还要花另外12秒创建一个项目,然后才开始写代码。而有时灵感来了就那么几秒的事情,20秒左右的时间已经完全可以完成一个概念验证。

RoslynPad

这款可能是LINQPad的“政治正确”型的对手。它完全免费,而且跨平台——能在MacLinux上运行(跨平台UI组件是Avalonia)。它还是完全开源项目:https://github.com/aelij/RoslynPad ,你甚至可以把它代码下载过来随时自己编译一个——编译只需安装Visual Studio,然后按Ctrl+F5即可编译并运行。而且它支持.csx——基于C#的脚本语言,这种语言其实比.linq更流行一些,毕竟只要安装.NET SDK就能在服务器上运行。

至于它的缺点,最主要的是功能单一,以下我列个图表比较RoslynPadLINQPad的功能:

功能LINQPadRoslynPad
智能提示
NuGet包安装
脚本化运行
支持.NET Core
跨平台
开源
完全版免费
VBF#支持
丰富的快捷键
ILSpy反编译
图表功能
富媒体输出
表格输出
不换行输出
JToken感知输出
数据库连接

综上,RoslynPad算是低配版的LINQPad,我推荐不想买LINQPad高级版的朋友,使用这个工具。

Xamarin Workbooks

这个工具仿照的是Jupyter Notebook,后者现在其实已经运行了C#/.NET,也支持的是.csx脚本。这个工具在输出时相比RoslynPad有一定优势,但我之前试用发现有一些bug,比如有时界面会卡住不能操作。

但其实写文档和做快速POC其实是两码事,就算是做文档,代码的部分其实也不多,因此这类工具定位与我的需求有差异。

价格

首先聊它的免费版,免费版的LINQPad提供了完整的代码功能、数据库连接功能和命令行功能,但限制了智能提示,也不能安装NuGet包。我想对大多数人来说,智能提示的缺失很致命。

在我真正购买正版授权之前,我花了约一个月的时候完全使用免费版,因为我觉得这个工具的最佳的优点在于做超快速的POC——这一点是任何其它工具都做不到的。因此我认为就算是免费版,也有它不可或缺的意义。(另外可能还有一个小小的原因是,我常常训练自己尽量不依赖IDE提示写代码

标签:功能,C#,代码,LINQPad,NET,POC
From: https://www.cnblogs.com/sexintercourse/p/18473768

相关文章

  • .NET导出Excel的四种方法及评测
    .NET导出Excel的四种方法及评测 .NET导出Excel的四种方法及评测导出Excel是.NET的常见需求,开源社区、市场上,都提供了不少各式各样的Excel操作相关包。本文,我将使用NPOI、EPPlus、OpenXML、Aspose.Cells四个市面上常见的库,各完成一个导出Excel示例。然后对其代码风格和性能做......
  • 解析“60k”大佬的19道C#面试题(上)
    解析“60k”大佬的19道C#面试题(上) 解析“60k”大佬的19道C#面试题(上)先略看题目:请简述async函数的编译方式请简述Task状态机的实现和工作机制请简述await的作用和原理,并说明和GetResult()有什么区别Task和Thread有区别吗?如果有请简述区别简述yield的作用利用IEnumerab......
  • NordicOI 2023
    A.ChatNOI题目描述给定一个由\(N\)个小写英文单词组成的文章,我们定义一个\(k+1\)个单词的可能性为其在文章中的出现次数。现在给出一个句子的前\(k\)个单词,你要补全后面的\(m\)个单词,使得其中所有长度为\(k+1\)的字串的可能性最小值最大。有\(Q\)次询问。思路因......
  • CF571B-题解
    CF571B题意给定数组\(A\)和值\(k\),你可以重排\(A\)中的元素,使得\(\displaystyle\sum_{i=1}^{n-k}|A_i-A_{i+k}|\)最小。输出最小值。思路\(A_i,A_{i+k}\)就等同于在将\(i\)模\(k\)的意义上把\(A\)分为若干组贪心的想要使\(\displaystyle\sum_{i=1}^{n-k}|A_i-A......
  • Leetcode 721. 账户合并
    1.题目基本信息1.1.题目描述给定一个列表accounts,每个元素accounts[i]是一个字符串列表,其中第一个元素accounts[i][0]是名称(name),其余元素是emails表示该账户的邮箱地址。现在,我们想合并这些账户。如果两个账户都有一些共同的邮箱地址,则两个账户必定属于同一个人。请......
  • C#学习笔记之编码
    C#学习笔记之编码 归纳:一、ASCII码ASCII码是用来表示英文字符的一种编规范,每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数为255(00H-FFH)。 二、Unicode码Unicode也是一种字符编码方法,它占用两个字节(0000H-FFFFH),容纳65536个字符。三、UTF-8以8位为......
  • Monaco Editor 实现一个日志查看器
    MonacoEditor实现一个日志查看器 我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:文长前言在WebIDE中,控制台中展示日志是至关重要的功能。MonacoEditor作为一个强大的代码......
  • GPUInstance
    关于GPUInstance1.用于渲染加速的硬件特性.gpu硬件支持的一种特性,使用少量的渲染调用(DrawCall)渲染同一网格的多个副本.也就是说在渲染时,他只需要提交一个网格副本,一个材质球,然后在把这些模型对象中不同的属性(比如:位置,大小,旋转,颜色等)提取出来放到一个数组中.这是最......
  • 深入解析React DnD拖拽原理,轻松掌握拖放技巧!
    深入解析ReactDnD拖拽原理,轻松掌握拖放技巧! 我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。。本文作者:霁明一、背景1、业务背景业务中会有一些需要实现拖拽的场景,尤其是偏视觉方向以及......
  • C# 文件流:Stream篇(一)
    C#文件流:Stream篇(一) 前话:本文系列本着备忘的目的进行归纳,Stream系列原文链接:C#温故而知新:Stream篇(—)-逆时针の风-博客园(cnblogs.com) 望各位看官到原作者处学习。后几篇不作注释,还请见谅----------------------------------------------------------------------......