01、LinqPad是干嘛的?

LinqPad 是一个可编写、运行C#(VB/F#/SQL)代码的轻量工具,C#开发者强烈推荐必备的工具,一个一旦用了就再也不想丢弃的工具。工具出自《C# 核心技术指南》的作者Joseph Albahari,一位.Net资深技术专家。

主要应用场景

  • 快速代码功能测试(功能测试、性能测试),这可能是最常用的场景了。
  • 把C#当成脚本语言,写一些小工具(含GUI),如爬虫工具、正则测试、API测试等。
  • 连接数据库,查询、调试数据,用Linq、SQL查询数据。

LINQPad是一个.Net的终极试验场,被广泛用于.Net学习、测试,主要特点:

  • 简单、轻量,工具只有20M+,界面简洁。
  • 快速运行任何C#、F#、VB的代码片段或程序。这一点非常方便,可以快速测试一些代码,一行代码、多行代码片段、一个方法都可以快速执行,不用打开庞大的VS IDE和项目了。
  • 支持切换不同.NET版本,测试各个版本的能力。
  • 输出非常方便,提供超级Dump扩展方法,可输出任何数据类型,且输出结果显示非常友好,甚至可以直接显示图片、图表。
  • 直接查看IL代码,及编译后的C#代码、机器码,内置了反编译工具ILSpy。
  • 支持安装Nuget包,扩展及其方便。
  • 内置了单元测试工具XUnit,性能测试工具Benchmark,且性能测试非常简单。
  • 强大的正则表达式测试功能。
  • 还有很强大的Linq查询数据库的操作。

唯一的缺点就是——付费,且不便宜,有免费版,但功能太少。有条件的可以下单支持一下,或者用其他某些方式先体验下,Linqpad crack


02、LinqPad简介

1、菜单

  • File:文件操作相关功能。
  • Edit:代码编辑相关功能,还有“preference”(偏好设置)。
  • Query:执行代码相关的功能,还包括Nuget管理、单元测试、性能测试功能。
  • Debug:调试相关功能。

2、资源区域,详见3.2

3、多标签的代码编辑功能

4、代码编辑区域

5、结果输出区域

  • Result:执行结果输出的区域。
  • IL+Native:实时输出的IL代码。
  • Tree:代码解析的语法树,
  • AI:支持OpenAI的智能代码提示、编写,需要APIKey。

每个Query(页签)的代码有一个独立的进程来执行,可以通过菜单栏“Query”》“Kill Process”来强制关闭当前Query代码进程。

6、添加Nuget或引用命名空间F4快捷键打开如下图配置,可添加Nuget包、添加Namespace引用。


03、常用功能

3.1、快速运行代码

支持多种语言模式,C#开发者常用的就是前面三种:

  • C# Expression :C#表达式语句,如果输入多行语句,工具会自动切换模式。
  • C# Statement :C#代码语句(片段),可任意多行代码、方法。
  • C# Program :完整的C#代码模式,和控制台的程序的入口程序Program类似。

可选择不同的.NET版本,最新的LinqPad 8版本支持到最最新的 .NET8、.NET9,如果要运行.NetFramework版本,则要用更老的LinqPad 5版本。

3.2、丰富代码示例,学习进阶

  • Samples”:内置丰富的代码示例,及不同C#版本的语法示例,可用来学习(+练习)C#的新语法知识。这里还有很多C#代码的的最佳实践,好好学习下可以显著提高C#技术。
  • My Queries”:代码可以保存到你本地,个人保存的代码文件都在这里。可用#load "fileName"的语法引用其他文件代码。
  • My Extensions”:这个代码文件中可以定义全局扩展方法,任意地方就可以使用了。

3.3、强大的Dump()输出

Dump()是一个扩展方法,万物皆可Dump()输出,主要作用就是输出内容,可以看做是超级版的Console.WriteLine()。简单的数值、字符、数组,复杂的对象、表格、动态数据都可以友好的输出,甚至Chart图表、图片也是可以的。

下面是一个Chart输出,非常简单方便,做一些简单的统计、可视化很轻松。

double[] xarr = { 1.0, 2.0, 4.0, 5.0 };
double[] yarr = { 2.0, 3.0, 1.0, 4.0 };
//chart dump
xarr.Chart().AddYSeries(yarr,SeriesType.Column).Dump();

3.4、代码调试、分析

支持代码断点调试,操作和VS类似,在行号前面打标记断点即可。更方便的的是实时的代码编译结果,可以查看编译后的C#代码、IL代码,及机器码,这非常方便学习。还内置了ILSpy,快捷键Shift+Alt+R,自动定位到当前代码的位置,当然也支持“F12”转到(ILSpy)源码。

上面的代码写了一个lock锁的简单示例,通过编译后的C#代码、IL代码,很容易发现lock是一个语法糖,实际是是用了混合锁Monitor来实现的。

04、性能测试Benchmark

用LinqPad做性能测试真的是太方便了,使用 BenchmarkDotNet 非常的简单、方便,效率也很高。而在VS中使用 BenchmarkDotNet 有点一言难尽,坑不少。具体可查看《C#中的Benchmark性能测试入门》。

  • 可以直接鼠标选中方法测试(方法无参数),不用专门写测试类、测试方法。
  • 也支持标准的BenchmarkDotNet测试流程,再Main()方法里执行BenchmarkRunner.Run<BenchMarkTest>();

如下代码,实现一个字符串的反序输出,随便写了几个实现,一个是用指针直接操作交换字符值,另个一个是常规的数组操作方式。

  • Inverse_ArrayReverse:用Array的Reverse方法实现翻转,需要创建一个字符数组、一个字符串(返回的)。
  • Inverse_For:for循环翻转。
  • Inverse_Pointer:指针原地翻转,无其他托管内存使用。
string Inverse_ArrayReverse()
{
var str = "123456789";
var arr = str.ToArray();
Array.Reverse(arr);
return new string(arr);
}
string Inverse_For()
{
var str = "123456789";
char[] arr = new char[str.Length];
for (int i = str.Length - 1; i >= 0; i--)
{
arr[str.Length - i - 1] = str[i];
}
return new string(arr);
}
unsafe string Inverse_Pointer()
{
var str = "123456789";
fixed (char* pstr = str)
{
for (int i = str.Length / 2 - 1; i >= 0; i--)
{
var temp = pstr[str.Length - i - 1];
pstr[str.Length - i - 1] = pstr[i];
pstr[i] = temp;
}
}
return str;
}

用Benchmark测试一下性能,在Linqpad上非常简单,选中上面两个方法,菜单“Query”>“Benchmark Selected Code”即可进行测试。

测试结果如下,结果很明显了,这很便于我们做一些性能的对比测试。Inverse_ArrayReverse()耗时更长(71.46 ns),而且还额外消耗更多GC内存(AllocatedBytes 分配的托管内存)。


参考资料


️版权申明:版权所有@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!原文编辑地址-语雀__

LinqPad:C#代码测试学习一品神器的更多相关文章

  1. phpunit测试学习 2 分类总结断言涉及哪些方面

    11:27 2015/12/9phpunit测试学习 2,  分类总结断言涉及哪些方面先推荐windows快速打开某处路径下的cmd,进入测试状态:可以在文件夹中,按住Shift+鼠标右键,这时候你就 ...

  2. phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识

    16:45 2015/12/8phpunit测试学习 1:一点简单的扼要有用的东西的总结  一点入门认识 具体的入门安装和入门实践请参照文中的推荐博客或网上其他博客推荐博客,我感觉这几篇博客写得很不错 ...

  3. Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试

    日常啰嗦 看到标题你可能会问为什么这一篇会谈到代码测试,不是说代码优化么?前两篇主要是讲了程序的输出及Log4j的使用,Log能够帮助我们进行bug的定位,优化开发流程,而代码测试有什么用呢?其实测试 ...

  4. HashMap在JDK1.8中并发操作,代码测试以及源码分析

    HashMap在JDK1.8中并发操作不会出现死循环,只会出现缺数据.测试如下: package JDKSource; import java.util.HashMap; import java.ut ...

  5. Web安全测试学习手册-业务逻辑测试

    i春秋作家:Vulkey_Chen 首先感谢朋友倾璇的邀请 http://payloads.online/archivers/2018-03-21/1 ,参与了<web安全测试学习手册>的 ...

  6. 从别人的代码中学习golang系列--01

    自己最近在思考一个问题,如何让自己的代码质量逐渐提高,于是想到整理这个系列,通过阅读别人的代码,从别人的代码中学习,来逐渐提高自己的代码质量.本篇是这个系列的第一篇,我也不知道自己会写多少篇,但是希望 ...

  7. Selenium自动化:有代码测试与无代码测试。这些你都懂了吗?

    大多数测试人员认为 Selenium是满足其测试自动化需求的自动化框架.作为全球测试人员使用的开放源框架, Selenium 无疑是测试人员适应日趋敏捷的公司的一种好方法.实际上, Selenium仍 ...

  8. Golang学习(用代码来学习) - 第一篇

    package main import ( "fmt" "time" "unsafe" ) //示例代码 var isActive bool ...

  9. Go语言:利用 TDD 驱动开发测试 学习结构体、方法和接口

    环境安装: (新手向)在Linux中使用VScode编写 "Hello,world"程序,并编写测试-Ubuntu20.4 上一篇相关随笔: Go语言:利用 TDD 测试驱动开发帮 ...

  10. PHP代码安全学习笔记V1.0

    PHP代码安全学习笔记V1.0http://www.docin.com/p-778369487.html

随机推荐

  1. Crealens.ai 免费体验GPT-4o 生图+吉卜力风格化

    自己的一张日常照片,能在几秒内变身为一幅充满童话感的吉卜力风插画?90%的人不知道,如今只需一句话,就能在 ChatGPT 里实现"AI 生图"--这就是 GPT-4o 生图功能的 ...

  2. Linux内存管理神器:smem工具

    大家好,我是良许. 今天给大家分享一款 Linux 系统里的内存管理神器:smem . smem 是Linux系统上的一款可以生成多种内存耗用报告的命令行工具.与现有工具不一样的是 smem 可以报告 ...

  3. 🎀腾讯云nodejs SDK打包体积过大吐槽事件

    简介 2025年2月1日有位开发同学batchor在GitHub上提出了issue(你们是把***打包了吗?)对腾讯云Node.js的SDK打包体积过大进行吐槽(言语偏贴吧风格略显激进),SDK打包体 ...

  4. js 计算精度问题解决

    js 计算精度问题解决 /** * * * @param x 需处理精度的数 * @param n 小数点后第 n 位 * @returns 处理后的数 */ function roundFracti ...

  5. eolinker环境变量配置:用例执行前给把某参数设置为全局参数的方法

    特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 1.场景分析 注册会员流程共计有添加数据,校验数据,提交 ...

  6. SpringBoot3整合SpringSecurity6(二)SpringSecurity默默的干了些啥

    写在前面 第一节中,我们基本上就引入SpringSecurity依赖,其他什么都没做就完成了认证功能. 之所以我们不用做什么,是因为SpringSecurity默认实现了很多功能. 当然了,这里默认实 ...

  7. Linux TCP网关的线程结构方案

    如果所示: 无论客户端还是服务端链接网关的socket都拆分为读EPoll.写EPoll分别独立. 有两个线程:线程A(左).线程B(右): 线程A负责服务端Socket的读和客户端socket的写, ...

  8. svg标签元素定位最有效的办法

    随着前端技术发展,svg(可伸缩矢量图形 )在前端应用中广泛被使用,然而采用传统的xpath元素定位方法已经无法对其进行定位,我们需要将svg标签及其包含的子标签用以下方式表达: *[name()=& ...

  9. P1758 [NOI2009] 管道取珠 题解

    题意: 有点复杂,看 原题面 吧. 思路 发现可以等价为两个人独立操作操作出来的序列相同的方案数. 然后发现复杂度阈值可以接受 \(n^3\),因此直接套路地设 \(f_{t,i,j}\) 表示两个人 ...

  10. Flutter视频压缩技术:如何在应用中优化视频文件的质量和大小?

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...