·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 你不知道的常用 代码分析 规范
visual studio有个功能,代码分析,一般开发完毕后,除了处理常规的“错误列表”显示的“错误”和“警告”,我们更加应该注意的是,运行代码分析功能,规范我们的代码,因为不好的编码习惯,在没有人指出和没有团队氛围的开发中,很多时候都是一路不规范到底
visual studio菜单的“分析”-》“对***运行代码分析”或者在解决方案的类库右击选择代码分析如果为了强迫自己养成良好的c#微软规范的习惯,我们可以右击类库属性,找到最后一行标签“代码分析”,并在对应右侧明细的“规则集”->"运行此规则集"下拉框中选择Microsoft的所有规则。当然如果你需要每次生成代码时让vs自动帮我们执行代码分析,也可以勾选上复选框“生成时启动代码分析”,在长时间的编码中如果每次都运行代码分析,我们的代码会越来越规范和高效率我找了以前的很多代码和网上下载的代码,以及公司的一些朋友的代码,逐一代码分析后,总结了如下常规开发中一般会遇到的规范问题,这些都不是错误或者警告,但是对于需要提高自身修养的程序员来说,这是必修课,当然本文只是抛砖引玉,更多的规范在微软的官方文档中都有,只是很多永远不会遇到MSDN:http://msdn.microsoft.com/zh-cn/library/dd264939(v=vs.100).aspx下面我将最最最常用的规范问题,总结在一段程序当中(相当简单的程序),朋友们可以不运行代码分析凭借自己的经验来判断,到底有多少处不规范的地方我敢保证,对于常规的要求不是很严格的开发,以下这些问题或多或少都会在您的代码中出现调用入口:
1 static void Main(string[] args) 2 { 3 try 4 { 5 Class_Test test1 = new Class_Test(); 6 test1.Fun1(); 7 } 8 catch (Exception ex) 9 {10 Console.WriteLine(ex.ToString());11 }12 Console.ReadLine();13 }
(代码1)
核心代码(为了查看方便把多个类放到同一个文件):
1 namespace TestBLL.Class_Test 2 { 3 public class Class_Test 4 { 5 public void Fun1() 6 { 7 const int param1 = 10; 8 string name = param1.ToString(); 9 if (name == "")10 {11 Console.WriteLine("empty");12 }13 else14 {15 try16 {17 Class_Test2 test2 = new Class_Test2();18 test2.Age = 25;19 Fun_Test1("", ref test2, 100, "");20 21 bool param2 = Boolean.Parse(name);22 Console.WriteLine(param2);23 List<string> list = new List<string>();24 list.Add(name);25 }26 catch (Exception ex)27 {28 Console.WriteLine(ex.Message);29 throw ex;30 }31 }32 }33 public void Fun_Test1(string param1, ref Class_Test2 param2, int param3, string Param4)34 {35 string param5 = "";36 param2.Age = 24;37 param2.Fun1(param1, Param4, ref param5);38 39 }40 }41 public class Class_Test242 {43 public int Age { get; set; }44 public string getTimeType()45 {46 string TimeType = string.Empty;47 int hour = DateTime.Now.Hour;48 if (hour >= 1 && hour < 5)49 TimeType = "凌晨";50 else if (hour >= 5 && hour < 11)51 TimeType = "早上";52 return TimeType;53 }54 public void Fun1(string param, string param1, ref string param2)55 {56 # region57 for (int i = 0; i < 10; i++)58 {59 string name = "yhc";60 Console.WriteLine(name);61 }62 //此处省略99个如上for循环代码块63 #endregion64 Fun2();65 Console.WriteLine(param);66 }67 PRivate void Fun2()68 {69 Console.WriteLine();70 }71 }72 public class Class_Test373 {74 public static void Fun1()75 {76 }77 }78 public struct StructTest<T>79 {80 public List<T> rows;81 }82 }
(代码2)
代码分析后有N个警告,大多数都要引起重视1、CA2210程序集应具有有效的强名称用强名称密钥对 'TestBLL.dll' 进行签名。
2、CA1014用 CLSCompliantAttribute 标记程序集使用 CLSCompliant(true)来标记 'TestBLL.dll',因为它公开外部可见的类型。
3、 CA1709标识符的大小写应当正确更正程序集名称 'TestBLL.dll' 中“BLL”的大小写,将其改为“Bll”。(命名空间、类名等都是如此)
4、CA1707标识符不应包含下划线从命名空间名称“TestBLL.Class_Test”中移除下划线。
5、CA1724类型名不应与命名空间冲突类型名 'ClassTest' 与命名空间名称“TestBLL.ClassTest”整体或部分冲突。请更改其中任一名称以消除冲突。
6、CA1305指定 IFormatProvider由于 'int.ToString()' 的行为可能会因当前用户的区域设置不同而不同,请将 'ClassTest.Fun1()' 中的此调用替换为对 'int.ToString(IFormatProvider)' 的调用。如果要向用户显示 'int.ToString(IFormatProvider)' 的结果,请指定 'CultureInfo.CurrentCulture' 作为“IFormatProvider”参数。或者,如果软件将存储和访问此结果(例如,当将此结果保留到磁盘或数据库中时),则指定 'CultureInfo.InvariantCulture'。
7、CA1820使用字符串长度测试是否有空字符串使用“String.IsNullOrEmpty”调用来替换 'ClassTest.Fun1()' 中的 'string.Operator ==(string, string)' 调用。
1 public bool Equals(string value)2 {3 if (this == null)4 {5 throw new NullReferenceException();6 }7 return value != null && (object.ReferenceEquals(this, value) || (this.Length == value.Length && string.EqualsHelper(this, value)));8 }
1 public static bool IsNullOrEmpty(string value)2 {3 return value == null || value.Length == 0;4 }
8、CA2200再次引发以保留堆栈详细信息'ClassTest.Fun1()' 再次引发捕获的异常并将其显式地指定为一个参数。请改用不带参数的“throw”以保留该异常最初引发时所在的堆栈位置。