VS2008调试警告及解决方法大全[转]

时间:2022-01-02 18:23:30

本篇转自:http://www.qujingwang.com/Show.aspx?bookid=389

我 是一个老程序员,所谓老,就是从html和asp,vs2005向vs2008过度,当然把*惯都带来了,这些习惯在调试和运行时编译可以通过,也可以 执行,但是有无数的警告。在VS2008环境中打开项目其中一个aspx.cs或ascx.cs文件,点菜单“生成”项中“对XXX运行代码分析”,警告 六七百个,很吓人,当然很多是因为同样的原因造成的。

  发布后把网站程序上传到虚拟服务器上,浏览网页时经常出现“Requst  Unavailable”,管理员说是程序错误太多,要关我的网站。我承认在改版时程序不是同步上传的,有几次错误,但也不能这样。换了服务器,不出现 “Requst  Unavailable”了,但编译时的警告也得处理,本人通过学习,收录了主要警告内容,和解决方法,希望大家补充。也有没解决,希望高人通过评论指 点。


一、网页方面警告:

  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& gt;");
                            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' 引用。 

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