LinqPad:C#代码测试学习神一品神器

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输出,非常简单方便,做一些简单的统计、可视化很轻松。

csharp 复制代码
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:指针原地翻转,无其他托管内存使用。
csharp 复制代码
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 分配的托管内存)。


参考资料


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

相关推荐
蓝胖子不会敲代码1 小时前
跟着AI学习C# Day26
开发语言·学习·c#
fs哆哆3 小时前
在VB.net中,文本插入的几个自定义函数
服务器·前端·javascript·html·.net
专注VB编程开发20年3 小时前
C# .NET多线程异步记录日声,队列LOG
java·开发语言·前端·数据库·c#
专注VB编程开发20年4 小时前
c#,vb.net LockObject ,多线程锁,多线程安全字典ConcurrentDictionary
开发语言·c#·.net
benben0447 小时前
Unity3D仿星露谷物语开发69之动作声音
游戏·ui·unity·c#·游戏引擎
唐青枫7 小时前
C#.NET in、out、ref详解
c#·.net
99乘法口诀万物皆可变9 小时前
C#设计模式-Builder-生成器-对象创建型模式
开发语言·c#
钢铁男儿9 小时前
C# 数组(数组是对象和一维数组和矩形数组)
算法·c#
cfqq198911 小时前
class对象【C#】2025复习
开发语言·c#