1.整个解决方案包含一个启动项目和类库项目
启动项目只包含一个主窗体(FrmMain)和程序入口类文件(Program.cs)。
类库项目主要是实现不同的功能(功能性代码建议放到相应的类库项目中)。
2.启动项目和类库项目一般按照.NET Framework4.0配置
注意:不是.NET Framework4.0 client(此为精简版)。
3.启动配成x64或者x86平台,类库项目统一配置成Any CPU
注意:如果系统为64位,启动项目推荐配置成x64平台,这样可以更好的利用64位机器的内存空间。但是64位程序可能存在调用一些dll不兼容的问题,详情请参考博客C# 编译器选项 /platform(指定输出平台)32位程序运行到x64平台的问题。我这里面配置成了x86平台。
对于类库项目,则推荐配置为Any CPU,这样程序类库可以在任意平台上运行。详情请参考博客C#中Any CPU和X86和X64平台的差异对比。
4.类库项目中窗体和类命名规范
窗体统一放入Forms文件夹中,以Frm开头,命名尽量做到见名知意,并保持命名空间名称一致。
类文件统一放入Classes文件夹中,以Cls开头,命名尽量做到见名知意,并保持命名空间名称一致。
5.数据库连接
对于数据库连接等代码,应只调用一处连接,并把数据库连接配置到App.config文件中或者Properties下的Settings.setting文件,或者直接配置成xml文件进行统一的数据库连接配置。
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<appSettings>
<add key="SqlServerConnectionString" name="Data Source=.;Initial Catalog=XXXX;Persist Security Info=True;User ID=sa;Password=1"/>
</appSettings>
</configuration>
6.代码重构
1)完成功能后,需要进行代码重构,主要对代码进行方法、类、接口的封装,尽量避免代码冗余。
2)对于重复利用的代码片段,尽量封装成公用的方法并放入单独的类文件和类库项目中(通常放入以XXXXCommon命名的类库项目中)。
7.SVN使用建议
1)每天晚下班前必须将当天的程序编译调试通过并上传SVN。
2)每天早上上班首先需要更新SVN最新版本。
3)在程序中添加页面、删除页面及修改页面命名时,需要先更新全部程序特别是解决方案文件,然后再做添加或者删除页面以及修改页面名称,做完这类操作后需立刻上传SVN,以免造成解决方案冲突。
4)bin文件夹、obj文件夹、 *.suo *.user 等不允许提交到SVN上,应在本地通过SVN客户端添加到忽略列表中。
5)svn代码冲突不可避免,要养成一定的解决代码冲突的能力,同时,一个启动项目多个类库项目的代码层次一定程度上可以减少代码冲突的产生。
8.代码调试
1)程序中如果出现弹框提示:那么一般是两种情况导致的,第一是写了一个MessageBox弹框提示;第二是程序中存在try catch。
2)写代码的时候最好加上try….catch….finally,但是在调试的时候需要全部注释掉try catch,这样代码出现问题才会显示出错的地方。
9.C#代码习惯
1)C#代码本来就很长,尽量把代码写短。循环中不要频繁调用包含循环的函数。
2)代码中最多三层循环,多于三层的循环就要想像其它办法了。
3) 对于处理数据的代码,一定要提前判断出由于数据异常可能导致的系统崩溃等原因。然后在代码中写一个处理数据异常的函数。这样才能提高系统的容错性。比如对于key,value键值对,其都可以为字符串类型,但是字符串中可以包含各种各样的数据。因此需要考虑到字符串是否包含数字,下划线等其他字符,字符串前后是否有空格等情况。
4) 避免在主窗体中注册事件,否则控件的某个事件注册可能会影响到该控件的其他事件(尤其是在同一个事件中需要完成不同的功能时,比如SceneControl中面积量算和地形开挖都会用到其Tracking和Tracked事件,此时这两个事件需要完成不同的功能,所以最好封装在单独的类中而不是主窗体中)。鼠标的单击事件、SceneControl的鼠标追踪事件应该封装到单独的类中,并且应该在该类的构造函数中完成事件注册,而不是某个函数中。最后调用某个函数注销所有的注册过的事件。
当然,也可以用switch选择语句,但是如果实现的功能比较多的话,用switch选择语句处理的话,相应的事件中的代码量会非常大。