VS2010 调试警告 解决方法

时间:2022-07-20 09:25:20

突然心血来潮,把vs2010的代码规则设置为微软所有规则,分析过后,获益匪浅,特此记录。下面前半部分是网上另外一位兄弟的成果,转载过来的:

一、网页方面警告:

1、象link meta br img这样的空元素必须以“/>”结束,img要有alt属性
如:<meta http-equiv="Content-Type" content="text/html; charset=gb2312
"/>
  <img src="/homeimg/a_05.gif" alt="1" width="9" height="9" 
/>
  2、height不是table的有效属性
         解决方法:可以把height下放到td中。
  3、background 不是td的有效属性
       如: <td width="75" 
background="/homeimg/hg_2.gif">高老庄</a></td>
  解决方法:<td style="width:75px; height:25px;
background:url(/homeimg/hg_1.gif)">
  参  考:background与background-image的区别和应用
      
http://www.qujingwang.com/Show.aspx?bookID=365
  4、警告内容:验证 (XHTML 1.0 Transitional): 此名称包含大写字符,而名称中不允许使用大写字符。
  如:“<
IMG height=29 alt=电信用户下载地址 ... ...”

  5、验证(XHTML 1.0 Transitional): 不支持元素“marquee”、不支持的还有embed
  6、验证 (XHTML 1.0 Transitional): 属性值必须用引号括起来。
        如:height
="29"
  7、验证 (XHTML 1.0 Transitional): 元素“script”缺少必需的属性“type”。
  8、验证 (XHTML 1.0 Transitional): 属性“width”被视为已过时。建议使用较新的构造。
  解决方法: 放到style里面去,<div   
style   ="width:100px"   ></div>   
          过时的属性列表:width,border,height,align,bgcolor,font,name
  9、align的属性值不包括“absmiddle”
  10、验证 (XHTML 1.0 Transitional): 元素“form”不能嵌套在元素“table”中、元素“tr”不能嵌套在元素“form”中。


二、程序方面警告:

1、关于字符串为空或不为空

  1) if(strTitle=="")
  2)if(strTitle==String.Empty)
        应改为 if(String.IsNullOrEmpty(strTitle))
  3)if(strTitle!="")
  4)if(strTitle!=String.Empty)
        应改为 if (!String.IsNullOrEmpty(txtSeach.Text))

  警告内容:CA1820 : Microsoft.Performance : 使用“String.IsNullOrEmpty”调用来替换 'Header.ImbtnSeach_Command(object, CommandEventArgs)' 中的 'string.operator !=(string, string)' 调用

2、字符串或整数在定义时,系统都会自动初始化,不需要赋值
  string strTitle=“”;
        int       iHIght=0;
        private SqlConnection con = null;
  以上三种初始化没必要,请去掉。
  警告内容:将类型为 'int' 的字段 'UserOperate.age' 初始化为 0。由于此初始化过程将由运行时自动完成,因此请移除它。

3、关于DataTable 和DataSet 的定义
  警告内容:CA1306 : Microsoft.Globalization : 只要 创建了 DataTable 类型的实例,就必须设置这一 Locale 属性。
  警告指向:
   a) DataTable table = new DataTable();
             table = userAccount.getUserMoneyList(strUserID);
   b)DataSet ds = new DataSet();
            ds = expertopic.FindTopicByUserID("ExperTopic", strUserID);
  解决方法: 
          a) table.Locale = CultureInfo.InvariantCulture;
   b) ds.Locale = CultureInfo.InvariantCulture;
             在该cs文件中添加引用using System.Globalization;
  相关内容: DataTable中不区分全角数字和半角数字的问题,在一个项目中突然客户反映原来使用得好好的功能现在不能用了,问现象也说不出什么。只是说提示数据重复了。到现场后发现原来DataTable中将全角数字和半角数字认为是相同的。故本来不同的数据也认为是相同的数据了。
       网上查资料得知,添加如下代码可以解决:
       DataTable.Locale = CultureInfo.InvariantCulture;
       DataTable.CaseSensitive = true;
       参考:
http://msdn.microsoft.com/en-us/system.data.datatable.locale(zh-tw).aspx

4、IndexOf()和LastIndexOf()
  警告内容: CA1307 : Microsoft.Globalization : 调用不显式提供 StringComparison 的 'string.IndexOf(string)'。应将其替换为对 'string.IndexOf(string, StringComparison)' 的调用。

  解决方法:在indexof中加一参数:int pos = s.IndexOf("bb", StringComparison.OrdinalIgnoreCase); (该参数是要忽略大小写的,参数意义看下文)
  参考内容:
http://www.qujingwang.com/Show.aspx?bookID=385

5、警告内容: CA1822 : Microsoft.Performance : 从未使用 'IdAuthenticate.CheckidCard(string)' 的“this”参数(Visual Basic 中为“Me”)。根据需要,将成员标记为 static (Visual Basic 中为“Shared”),或者在方法体或至少一个属性访问器中使用“this”/“Me”。
  解决方法:在方法定义前加 static 

6、警告内容: 声明了变量“exp”,但从未使用过
                 变量“sql”已赋值,但其值从未使用过 

7、Page.RegisterStartupScript("openwin ", "<script>alter('请输入要搜索的内容!')</script>"); 
  警告内容: “System.Web.UI.Page.RegisterStartupScript(string, string)”已过时:“The recommended alternative is ClientScript.RegisterStartupScript(Type type, string key, string script). 
http://go.microsoft.com/fwlink/?linkid=14202

8、Convert转换警告
  警告内容:CA1305 : Microsoft.Globalization : 由于 'Convert.ToInt32(string)' 的行为可能因当前用户的区域设置不同而不同,请将 'DataOperate.DllBind(参数s)' 中的此调用替换为对'Convert.ToInt32(string, IFormatProvider)' 的调用。如果要向用户显示 'Convert.ToInt32(string, IFormatProvider)' 的结果,请将“CultureInfo.CurrentCulture”指定为“IFormatProvider”参数;另外,如果软件将存储和访问此结果(例如,要将它保留到磁盘或数据库中),则指定“CultureInfo.InvariantCulture”。

 labTPage.Text = Convert.ToString(ps.PageCount);
 private DateTime leavetime = Convert.ToDateTime(DateTime.Now.ToShortDateString());
 int bookID = Convert.ToInt32(Request.QueryString.Get("bookID"));
 iFileSize =(float) Convert.ToDouble(lblFileSize.Text);
  以上四例会出同样的问题
       解决方法是:在ToDouble、ToString的参数中增加参数CultureInfo.InvariantCulture,如上例可改为iFileSize =(float) Convert.ToDouble(lblFileSize.Text,CultureInfo.InvariantCulture);
       需引用 using System.Globalization;

  int.ToString();可改为int.ToString(CultureInfo.InvariantCulture);
  String.ToLower();可改为String.ToLower(CultureInfo.InvariantCulture);
  int.Parse(Wi[i]) 可改为 int.Parse(Wi[i],CultureInfo.InvariantCulture) ;
但并不是所有的ToString和ToLower改了以后都正确,看调试提示吧。

三、名称命名规范警告:

1、     int       intHight;
  警告内容:不好的变量定义 ,变量名字中不要包含int。

2、当变量定义中包含ID,OK时,D要小写,K要小写,即写成Id,Ok
  如 string UserId

3、定义方法(函数)时,首字母要大些,    如:
a) protected void 
BtnFind_Click(object sender, EventArgs e){   ... ...   }
b) protected void 
GVsearch_RowDataBound(object sender, GridViewRowEventArgs e){}
   c)protected void 
GvlWordInfo_PageIndexChanging(object sender, GridViewPageEventArgs 
  注:首字母大写,后边第一个是小写,第二个是大写不行的。如:protected void
GvLWordInfo_PageIndexChanging(object sender, GridViewPageEventArgs e)

4、警告内容: Microsoft.Naming : 从命名空间名称“NetShop.App_Code”中移除下划线。 命名空间或类名称中不允许下划线。

5、CA1709 : Microsoft.Naming : 更正命名空间名称“NetShop.usrgl_files”中“files”的大小写,将其改为“Files”。 
  说明:在此usrgl_files是个文件夹。这个命名有两个问题,使用了下划线和首字母没大写。

6、命名中不要出现login、logout,要 用 logOn和logOff替代。

7、方法(函数)的参数定义要用小写。

8、错误所指:
BooksDetails booksDetails = new BooksDetails();
  警告内容:CA1500 : Microsoft.Maintainability : 'booksDetails' ('SubmitExperPassed.BindInfo()' 中声明的变量与该类型的某一实例字段同名。请更改其中一项的名称。
  修改方法:实例名称和类或命名空间同名,方法中定义的变量与方法同名,修改之。

9、定义方法的参数名称不能和类的全局变量同名。

四、未解决问题:

1、警告内容:CA1020 : Microsoft.Design : 考虑将“NumberTwoNetShop.WebService”中定义的类型与另一个命名空间合并。 

2、警告内容:CA2210 : Microsoft.Design : 用强名称密钥对 'NumberTwoNetShop.dll' 进行签名。

3、警告内容:CA1014 : Microsoft.Design : 使用 CLSCompliant(true)来标记 'NetShop.dll',因为它公开外部可见的类型。  

4、警告内容:CA1001 : Microsoft.Design : 在 'DataBase' 上实现 IDisposable,因为它创建下列 IDisposable 类型的成员: 'SqlConnection'。如果以前提供过 'DataBase',对于现有使用者来说,向此类型添加用于实现 IDisposable 的新成员属于重大更改。 
  警告所指:   public class DataBase{}

5、警告内容:CA1822 : Microsoft.Performance : 从未使用 'DataBase.MakeInParam(string, SqlDbType, int, object)' 的“this”参数(Visual Basic 中为“Me”)。根据需要,将成员标记为 static (Visual Basic 中为“Shared”),或者在方法体或至少一个属性访问器中使用“this”/“Me”。
       在本类中调用方法,在方法名称前加上static即可,但若在别的类中定义实例再调用,加上static就会出错。

6、警告内容:CA1502 : Microsoft.Maintainability : 'BookDetails.BindData()' 的圈复杂度为 31。重写或重构该方法,以便将复杂度降低到 25。
  警告原因:我的方法行数太多,逻辑是复杂点,变成小函数就应该OK了。

7、警告内容:CA1031 : Microsoft.Design : 修改以下内容 以便捕捉比 'object' 更具体的异常,或者再次引发该异常。
  警告所指:
            try
            {
                bookID = .....;
            }
            catch
            {
                bookID = 0;
            };
            catch 后边的参数没用,我就不想要。

8、警告内容:CA1031 : Microsoft.Design : 修改 'IdAuthenticate.BtnUpload_Click(object, EventArgs)' 以便捕捉比 'Exception' 更具体的异常,或者再次引发该异常。
  警告所指:try
                        {
                            System.IO.Directory.CreateDirectory(path);
                        }
                        catch (Exception ex)
                        {
                            Response.Write("<script language=javascript>alert('文件上传失败原因:"+ex.Message+"!')</script>");
                            return;
                        }

9、警告内容:CA1304 : Microsoft.Globalization : 由于 'string.ToLower()' 的行为可能因当前用户的区域设置不同而不同,请将 'Remark.TakeRemark(string)' 中的此调用替换为对 'string.ToLower(CultureInfo)' 的调用。如果要向用户显示 'string.ToLower(CultureInfo)' 的结果,请将“CultureInfo.CurrentCulture”指定为“CultureInfo”参数;如果软件将存储和访问此结果(例如,要将它保留到磁盘或数据库中),则指定“CultureInfo.InvariantCulture”。 
          我改成string.ToLower(CultureInfo.InvariantCulture)后,又报警告:
           Microsoft.Globalization : 在方法 'IdAuthenticate.BtnUpload_Click(object, EventArgs)' 中,将对 'string.ToLower(CultureInfo)' 的调用替换为 String.ToUpperInvariant()。

10、警告内容:CA1819 : Microsoft.Performance : 将 'GetValidateCode.Colors' 更改为返回集合或将其转换为方法。 
  警告所指: 
      public Color[] Colors
        {
            get { return colors; }
            set { colors = value; }
        }

11、警告内容:CA2234 : Microsoft.Usage : 修改 'BookDetails.BindData()' 以调用 'WebRequest.Create(Uri)' 而不调用 'WebRequest.Create(string)'。
  警告所指:myReq = (HttpWebRequest)WebRequest.Create(url);        
                             url我定义成了string类型

12、警告内容:CA0060 : 无法找到间接引用的程序集“System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”。此程序集不是分析所必需的,但是分析结果可能不完整。此程序集已由 'AjaxControlToolkit.dll' 引用。 

  以上警告还没解决,望高人通过评论指点。其他警告和解决方法望达人补充!

补充:警告 8 CA1824 : Microsoft.Performance : 由于程序集 'ComTopGisEx.exe' 包含基于 ResX 的资源文件,因此请使用 NeutralResourcesLanguage 特性来标记它,并指定该程序集内的资源所采用的语言。这会改进首次检索资源时的查找性能。

[assembly: NeutralResourcesLanguage("zh-CN", UltimateResourceFallbackLocation.Satellite)]

警告 8 CA2210 : Microsoft.Design : 用强名称密钥对 'ComTopGisEx.exe' 进行签名。

解决方法 属性 程序集 签名 为程序集签名

警告 8 CA1014 : Microsoft.Design : 使用 CLSCompliant(true)来标记 'ComTopGisEx.exe',因为它公开外部可见的类型。 ComTopGisEx

[assembly: CLSCompliant(true)]  AssemblyInfo.cs

警告 35 CA1306 : Microsoft.Globalization : 只要 'DataTableTemplete.GetEquipmentTypesDTTemplate()' 创建了 DataTable 类型的实例,就必须设置这一 Locale 属性。 E:/Document/Visual Studio 2005/Projects/ComTopGisExWPF/ComTopGisEx/Common/DataTableTemplete.cs 43

dtResult.Locale = CultureInfo.InvariantCulture;

警告 10 CA1305 : Microsoft.Globalization : 由于 'string.Format(string, object, object, object)' 的行为可能会因当前用户的区域设置不同而不同,请将 'OracleUtil.OracleUtil(string, string, string)' 中的此调用替换为对 'string.Format(IFormatProvider, string, params object[])' 的调用。如果要向用户显示 'string.Format(IFormatProvider, string, params object[])' 的结果,请指定 'CultureInfo.CurrentCulture' 作为“IFormatProvider”参数。或者,如果软件将存储和访问此结果(例如,当将此结果保留到磁盘或数据库中时),则指定 'CultureInfo.InvariantCulture'。 E:/Document/Visual Studio 2005/Projects/ComTopGisExWPF/ComTopGisEx/Common/OracleUtil.cs 63          试用string.format(CultureInfo("zh-cn"),...)