·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 你不知道的常用 代码分析 规范

你不知道的常用 代码分析 规范

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

你不知道的常用 代码分析 规范

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' 进行签名。  

  • 微软认为为程序集添加签名,防止程序集被恶意篡改,是需要做得工作,但是大多数时候我们都不会做签名,毕竟很多时候是为企业内部定制软件或者挂在  服务端的web服务器上,不做任何的传输共享
  • 如果您需要为程序集添加签名,详细参考地址:http://www.cnblogs.com/cpcpc/archive/2011/01/17/2123086.htmlhttp://www.cnblogs.com/yangecnu/archive/2013/01/01/2841235.html
  • 如果你觉得没有必要,可以在“操作”中选择“禁止显示此消息”

2、CA1014用 CLSCompliantAttribute 标记程序集使用 CLSCompliant(true)来标记 'TestBLL.dll',因为它公开外部可见的类型。

  • 如果您的程序集需要跨编程语言使用,并且您知道cls(公共语言规范)的概念,那么您必须处理这条警告,因为必须用CLSCompliantAttribute显式指示 CLS 符合性,让您的程序集在跨语言使用时不会出现冲突或者异常,比如vb中函数是不区分大小写,如果您不处理这条警告,在编写您的程序集时,您在代码同一个Class中有两个方法,只是大小写不同,例如Fun和fun,那么不会有任何警告和问题,但是被vb中调用就会报异常
  • 如果您需要使用CLSCompliantAttribute 来标记程序集,只需要在AssemblyInfo.cs文件中添加命名空间引用using System;并加上代码[assembly:CLSCompliant(true)]即可详细参考地址:http://www.cnblogs.com/mywebname/articles/598460.htmlhttp://msdn.microsoft.com/zh-cn/library/ms182156
  • 如果你觉得没有必要,可以在“操作”中选择“禁止显示此消息”

3、 CA1709标识符的大小写应当正确更正程序集名称 'TestBLL.dll' 中“BLL”的大小写,将其改为“Bll”。(命名空间、类名等都是如此)

  • 我们都知道Camel和Pascal命名规则,也会经常按照此规则编写代码,但是还是会经常写出类似TestBLL的命名代码,这边很多人忽略的是双字母单词,一般的vs分析会检测您的命名中是否存在双字母单词(双字母单词固定就那么多),如果存在则不会报错比如:采用Pascal命名规范给程序集命名TestDB,那么不会发出警告,因为DB是属于双字母单词,如果采用Pascal命名规则,那么一般三个或者三个以上字符是不允许出现全部大写的,比如这里的TestBLL中的"BLL"
  • 详细参考地址:http://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=ZH-CN&k=k(CA1709);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true

4、CA1707标识符不应包含下划线从命名空间名称“TestBLL.Class_Test”中移除下划线。

  • 在.NET平台下,微软不建议使用匈牙利命名法,所以在这里有下划线的存在也会抛出警告,后面的类名Class_Test2、Class_Test3,以及方法名Fun_Test1都是不规范的
  • 详细参考地址:http://msdn.microsoft.com/library/ms182245(VS.100).aspx

5、CA1724类型名不应与命名空间冲突类型名 'ClassTest' 与命名空间名称“TestBLL.ClassTest”整体或部分冲突。请更改其中任一名称以消除冲突。

  • 在代码2中的类型名 'ClassTest' 与命名空间名称“TestBLL.ClassTest”发生了部分冲突,这样会使库的可用性下降
  • 详细参考地址:http://msdn.microsoft.com/zh-cn/library/vstudio/ms182257(v=vs.110).aspx

6、CA1305指定 IFormatProvider由于 'int.ToString()' 的行为可能会因当前用户的区域设置不同而不同,请将 'ClassTest.Fun1()' 中的此调用替换为对 'int.ToString(IFormatProvider)' 的调用。如果要向用户显示 'int.ToString(IFormatProvider)' 的结果,请指定 'CultureInfo.CurrentCulture' 作为“IFormatProvider”参数。或者,如果软件将存储和访问此结果(例如,当将此结果保留到磁盘或数据库中时),则指定 'CultureInfo.InvariantCulture'。

  • 代码位置:代码2中的8行,string name = param1.ToString();
  • 在数据具有逻辑性判断或者存储数据的时候,一些区域化参数一定不要忘记,几乎所有时候我们都是基本本国开发,从来不会考虑这些参数,包括ToString(),ToUpper(),DateTime.ToShortDateString(),DateTime.ToString()等等,所以也从来没有问题,那是因为系统会选择你当前线程的CultureInfo(和你强制加参数CultureInfo.CurrentCulture效果一样)。虽然用户界面UI看上去很智能,但是带来的一个问题是:如果你的数据是纯逻辑性判断或者存储的时候,请不要偷懒,因为逻辑判断的值或者存储起来的值是需要一个固定的不需要随着区域而变化的值,否则服务端将各种异常奇怪现象,此时就要设置'CultureInfo.InvariantCulture',因为它是不依赖于区域性(固定)的 System.Globalization.CultureInfo 对象
  • 详细参考地址:http://weishangxue.blog.163.com/blog/static/2157518820117193125196/
  • 修改为:string name = param1.ToString(CultureInfo.InvariantCulture);

7、CA1820使用字符串长度测试是否有空字符串使用“String.IsNullOrEmpty”调用来替换 'ClassTest.Fun1()' 中的 'string.Operator ==(string, string)' 调用。

  • 代码未知:代码2中的9行,if (name == "" )
  • 判断字符串是否为空,请不要再用equals 或者== “”了,因为字符串的equal或者==(操作符重载)都是重载过的,object的equal或者==都是比较是否引用相同,而string重载后则是比较值了,首先可以确定的是String.IsNullOrEmpty或者String.Length肯定比equals或者==“”效率高,因为用ILDASM查看il代码时,发现执行的il代码行数前者比后者少,这是其次,最重要的是用ILSpy反编译String类的Equals代码后发现,内部做了太多操作
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         }
  • 详细参考地址:http://msdn.microsoft.com/library/ms182279(VS.100).aspx
  • 修改为:if (string.IsNullOrEmpty(name) )

8、CA2200再次引发以保留堆栈详细信息'ClassTest.Fun1()' 再次引发捕获的异常并将其显式地指定为一个参数。请改用不带参数的“throw”以保留该异常最初引发时所在的堆栈位置。

  • 代码位置:代码2中的29行,throw ex;
  • 这边有两个问题,第一:捕捉异常最好不用直接用Exception类型来捕捉,因为这样系统会遍历所有异常信息来查找匹配的异常,导致的后果就是一旦发生异常,系统就会卡顿很久,最好的做法是由上到下先捕捉可能会发生的异常类型,最后再捕捉异常类型基类Exception,常见的异常类并不是很多,如果有时候您根本不知道你应该写什么异常类型,那么您先保存下常用的异常类列表,使用时再去查看,时间长了自然就知道了,如下:
  • 上一篇文章:
  • 下一篇文章: