本篇转自: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' 引用。
以上警告还没解决,望高人通过评论指点。其他警告和解决方法望达人补充!