C#高级调试与VS技巧
- 断点
- 条件断点
- 联动断点
- 断点详细信息显示并输出
- VS技巧
- 常用快捷键
- 保存代码段
- 设置自己的代码命名规则
- 智能显示当前代码所处的Scope
- 固定的选项卡另外起一行
- 竖向选项卡
- C#规范注释
- ///自动生成注释
- para另起一行,see指向符号(可跳转),code插入代码
- param为方法参数添加注释
- Remarks和ParamRef为方法添加更规范注释概要
- 注释中的<,>转义
- 注释中的泛型或假定类型字符高亮
- C为指定字段突出
- 为泛型T添加注释typeparam
- 纯文本注释,不进行XML敏感字符转义CDATA[ ]
- list列表注释
- 加粗,斜体
- 常见的特殊字符转义
断点
条件断点
当得分==99时击中断点,多条件如下
其他模式条件
关于第三种模式,可用于判断的条件有以下几种,可以使用&,||,!来进行逻辑结合判断
分别是1机器设备名称,2进程ID,3进程名称,4线程ID,5线程名称
断点样式变为
联动断点
只有被关联的断点被击中时,才启用此断点
断点样式变为
断点详细信息显示并输出
右键原始断点
假设输出全部信息,则格式如下
Address:$ADDRESS,Caller:$CALLER,Callstack:$CALLSTACK,Filepos:$FILEPOS,Function:$FUNCTION,HitCount:$HITCOUNT,Pid:$PID,Pnname:$PNAME,Tick:$TICK,Tid:$TID,TName:$TNAME
输出如下
Address:Student.Student(string, int, int, string, string, string, string, int) + 0x0000000000000093,Caller:Program.<Main>$,Callstack: DebugTest.dll!Student.Student
DebugTest.dll!Program.<Main>$
,Filepos:xxxxxxxxxxxxxxxx\Program.cs(36),Function:Student.Student(string, int, int, string, string, string, string, int),HitCount:1,Pid:10140,Pnname:xxxxxxxxxxxxxxxxxxx\DebugTest.exe,Tick:388130656,Tid:37960,TName:Main Thread
Address:Student.Student(string, int, int, string, string, string, string, int) + 0x0000000000000093,Caller:Program.<Main>$,Callstack: DebugTest.dll!Student.Student
DebugTest.dll!Program.<Main>$
,Filepos:xxxxxxxxxxxxxxxxxxxx\Program.cs(36),Function:Student.Student(string, int, int, string, string, string, string, int),HitCount:2,Pid:10140,Pnname:xxxxxxxxxxxxxxxxxxxxx\DebugTest.exe,Tick:388130671,Tid:37960,TName:Main Thread
并且断点样式变为如下图,当前行代码前景色变为红色
VS技巧
常用快捷键
Ctrl F和Ctrl Shift F,分别当前页面和当前工程查找
Ctrl -和Ctrl Shift -后退到上一步、前进到上一步
Ctrl Shift V打开最近复制历史记录,最多记录10条
Ctrl Shift Alt 加上下方向键移动整行代码
Alt Shift =扩展选区,Alt Shift -缩小选区
Alt Shift 】选中一个代码块
保存代码段
选中代码段,然后拖进工具箱,右键可以重命名
下一次要使用同样的代码,从代码窗口的工具箱拖出来即可
设置自己的代码命名规则
工具-设置-文本编辑器-C#-命名规则
点击+号,新增命名规则
添加完后,点击OK,选择要应用该规则的关键字或者代码特性
当你的编码不符合定义的规范时,编译器就会提示你,提示的程度根据规范中的警告等级设置
智能显示当前代码所处的Scope
需要最新VS2022版本才支持
在写非常长的循环或者很多层嵌套的时候,可以便捷看到当前代码属于那一个代码块作用范围
固定的选项卡另外起一行
竖向选项卡
工具-选型-环境-选项卡和窗口
效果如图
C#规范注释
如果是要将你写的类库统一给别人调用的话,这还是很有必要的;如果都是自己写自己用,那无所谓
C#采用XML格式注释规范
见官方文档https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/xmldoc/recommended-tags
这里介绍最常用的
///自动生成注释
用于类、方法、字段等声明语句
效果如下,连续在声明语句上面,键入///就会自动生成
para另起一行,see指向符号(可跳转),code插入代码
param为方法参数添加注释
正确书写注释,按照规范,后面生成的xml文档就可以用于生成标准的API文档,如
Remarks和ParamRef为方法添加更规范注释概要
效果,根据不同的编辑器和代码样式,可能略有不同
代码
class TestClass
{
/// <summary>
/// 测试方法
/// </summary>
/// <remarks>
///<paramref name="name"/>:角色名称<para></para>
///<paramref name="entity"/>:角色实体,所属类型<see cref="Entity"/>继承自<see cref="EntityBase"/><para></para>
/// </remarks>
/// <param name="name">角色名称</param>
/// <param name="entity">角色实体</param>
void TestMethod(string name, Entity entity)
{
Console.WriteLine(name);
Console.WriteLine(entity);
}
}
record Entity(int Attack, int HP, double Speed) : EntityBase(Guid.NewGuid());
record EntityBase(Guid ID);
注释中的<,>转义
分别对应< >
注释中的泛型或假定类型字符高亮
例子如下
/// <summary>
/// 将数据转成CSV格式文本,并返回StringBuilder
/// <example>
/// <code>
///var teachers = Teacher.FakeMany(2);
///var students = Student.FakeMany(1000);
///CsvOprHelper
/// .ToCSV(
/// new List<<see cref="CsvDataBase"/>>()
/// {
/// new CsvDataNormal<<see cref="List{T}"/>>(teachers),
/// new CsvDataNormal<<see cref="List{T}"/>>(students),
/// new CsvDataNormal<<typeparamref name="T"/>>(school),
/// }
/// )
/// .SaveToFile(@"Desktop\工作簿1.xlsx");
/// </code>
/// </example>
///</summary>
/// <param name="csvDatas"></param>
/// <returns></returns>
public static StringBuilder ToCSV(List<CsvDataBase> csvDatas)
效果如图
C为指定字段突出
/// <summary>
/// Call this with : <c>Test();</c>
/// </summary>
void Test()
{
}
为泛型T添加注释typeparam
纯文本注释,不进行XML敏感字符转义CDATA[ ]
﹤![CDATA[ ]]>
注意:VS无法解析换行,一般用于介绍;你用这个写小说也可以
list列表注释
在C#中,XML注释可以使用list标签来创建一个列表。这个标签有一个type属性,可以设置为"bullet"、“number"或"table”,分别表示无序列表、有序列表和表格。
<list type="bullet">创建了一个无序列表。<item>标签用于定义列表中的每一项,<description>标签用于描述每一项的内容。
例如:
/// <summary>
/// This is a summary of the method.
/// <list type="bullet">
/// <item>
/// <description>Item 1</description>
/// </item>
/// <item>
/// <description>Item 2</description>
/// </item>
/// </list>
/// </summary>
public void SomeMethod1()
{
// method body
}
type参数支持以下三种类型:
bullet:创建一个无序列表,每个列表项前面都有一个小圆点。
number:创建一个有序列表,每个列表项前面都有一个数字,按照添加的顺序递增。
table:创建一个表格,需要使用listheader来定义表头,然后使用item来定义每一行,每一行内部使用term和description来定义单元格。
/// <summary>
/// This is a summary of the method.
/// <list type="table">
/// <listheader>
/// <term>Term 1</term>
/// <description>Description 1</description>
/// </listheader>
/// <item>
/// <term>Term 2</term>
/// <description>Description 2</description>
/// </item>
/// </list>
/// </summary>
public void SomeMethod()
{
// method body
}
加粗,斜体
<strong>加粗
<em>斜体
常见的特殊字符转义
&(和号):&
<(小于符号):<
>(大于符号):>
"(双引号):"
'(单引号):'

回车

换行