程序调试技术
使用VS错误报告
两种bug:语法错误,逻辑错误
语法错误
违反了C#语言的语法规定,如:string str = 'Hello';
(应为双引号)
例:试图在类外访问其私有成员、使用未赋值的变量等
寻找逻辑错误
跟踪代码:把VS配置为中断模式,把程序的输出选项选为Debug(把启动调试按钮后的下拉列表框内容调整为Debug)
单步执行程序
F11键或选择菜单命令“调试——逐语句”。
开始单步执行后代码首先停留在Main函数的第一行,按F10或F11向下执行。单步执行时可以选择是否路过一行代码中所调用的方法,是按F10,想进入过程进行更为细致的观察按F11。
VS监视窗口可以显示当前执行位置的变量值的情况,监视某个变量的值。
自动窗口:显示当前过程中的当前执行的所有变量。
局部变量窗口:显示当前运行位置附近的局部变量值。
设置断点
在可能出现问题的开始处设置断点,使程序能够在某一行停下来。
使用方法
首先把光标放在想要程序暂停的地方,按F9或单击那一行前边界,或“调试——新断点”
选择“调试——窗口”,打开局部变量窗口可以看到当前方法中的局部变量的值。打开即时窗口,在这个窗口中用户可以输入命令、查看变量,或计算表达式的值。
设置断点位置的策略
1、从大到小逐步缩小范围
2、注释掉可能出错的行
异常类与异常处理
异常类
C#程序设计实用教程(第二版)清华出版社 P182
异常处理
使用try、catch、finally关键字定义异常代码块
例:
public void test_notry()
{
int[] arr = { 0, 1, 2 };
for (int i = 0; i <= 3; i++) //i==3时越界
{
Console.WriteLine(arr[i]);
}
}
报错:
使用try—catch—finally妥善解决问题。
将有可能出现异常的代码放在try语句块中,将处理try语句块中出现异常的代码放在catch语句块中,finally语句是不管try语句中有没有异常发生,最后到要执行其中的程序块。
三种形式:
try—catch
try—catch—finally
try—finally
public void test_withtry()
{
int[] arr = { 0, 1, 2 };
try
{
for (int i = 0; i <= 3; i++)
{
Console.WriteLine(arr[i]);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
Console.WriteLine("Exit test_withtry");
}
}
catch块中包含的是出现异常时要执行的代码,在一个try后可以有0个以上的catch块。try中没有异常则不会执行catch,catch后面的括号中放入希望捕获的异常。当两个catch语句的异常类有派生关系时,要将包括派生的异常类catch语句放在前面,基类放在后面。
finally块包含了一定要执行的代码,通常是一些资源释放、关闭文件等代码。
例:含多个catch语句的示例
namespace MultiCatch
{
class Program
{
static void Main(string[] args)
{
test_withtry_mulcatch();
}
public static void test_withtry_mulcatch()
{
int[] arr = { 0, 1, 2 };
try
{
for (int i = 0; i <= 3; i++)
{
Console.WriteLine(arr[i]);
}
}
catch (IndexOutOfRangeException e)
{
Console.WriteLine(e.Message);
}
catch (Exception e) //Exception是所有异常的基类
{
Console.WriteLine(e.Message);
}
finally
{
Console.WriteLine("Exit test_withtry_mulcatch");
}
}
}
}
高质量编码标准
编码结构
好的缩进结构展现良好的代码层次结构
注释风格
尽量使用“///”注释,VS会根据注释内容给出代码编写提示,在调用类或方法时会更方便。
命名规范
两种命名规范:
(1)Pascal命名规范:每个单词的首字母大写,如:ProductType
(2)Camel命名规范:第一个单词的首字母小写,其他的大写
C#中推荐命名规则:
(1)类名使用Pascal命名规范
(2)方法使用Pascal规范命名
(3)变量和方法参数使用Camel命名规范
另:也可以加前缀表示变量类型。
例如:
public class HelloChina
{
int totalCount = 0;
void SayHelloToWho(string name)
{
string fullMessage = "Hello" + name;
}
}
避免文件过大
如果一个类中的代码超过300行要考虑将代码分到不同的类中。
避免写太长的方法,一个较理想的方法的代码为1~25行,方法名应尽量体现其功能。
注:功能独立的方法应尽可能分开。
使用异常处理
在捕捉异常后一定要有相应的处理操作,不要仅为防止程序崩溃使用异常处理,也不能捕捉异常后不加以处理。
异常处理的一般策略:在开发程序的过程中尽可能暴露程序的问题,是设计人员尽可能解决这些程序的异常。在系统发布后尽可能隐藏程序的问题,在发生异常时尽可能不直接显示给用户,而是给出友好的提示。
内容参考清华大学出版社《C#程序设计实用教程(第二版)》