Code analysis 笔记
托管代码的代码分析警告(按 CheckId 排列)
http://msdn.microsoft.com/zh-cn/library/dd380629
今天做了一下代码分析,笔记如下:
1. ToLower() 出现如下提示
Warning 4 CA1304 : Microsoft.Globalization : Because the behavior of 'string.ToLower()' could vary based on the current user's locale settings,
replace this call in 'CommonProvider.IsPathEqual(this string, string)' with a call to 'string.ToLower(CultureInfo)'.
If the result of 'string.ToLower(CultureInfo)' will be displayed to the user, specify 'CultureInfo.CurrentCulture' as the 'CultureInfo' parameter.
Otherwise, if the result will be stored and accessed by software, such as when it is persisted to disk or to a database, specify 'CultureInfo.InvariantCulture'.
涉及到区域语言,那我改成 ToLowerInvariant(),这样子总可以吧,不料,又有提示
CA1308:将字符串规范化为大写
字符串应正常化为大写字母。 少量字符转换为小写字母后不能再转换回来。 往返转换即是将字符从一个区域设置转换为另一个表示不同字符数据的区域设置,然后准确地从转换后的字符中检索到原始字符。
所以,还是改成 ToUpperInvariant()吧。
2.CA1704:标识符应正确拼写
一般情况下,不建议缩写,特别是每个单词的首字母拼起来,或者单词写一半。
例如,
public bool blibrary = false;
public List<DataSourceBase> GetPrevPage()
3.CA1002:不要公开泛型列表
Warning 37 CA1002 : Microsoft.Design : Change 'List<DriveType>' in 'IFileTree.SetDriveFilterForInclude(List<DriveType>)' to use Collection<T>, ReadOnlyCollection<T> or KeyedCollection<K,V> E:\Nero\source\gen_n11\Dev\backup\pb_backup\BiuLab\FileExplorerDemo\Interface\IFileTree.cs 88 FileExploreDemo
MS的意思是返回值类型最好是Collection<T>, ReadOnlyCollection<T> or KeyedCollection<K,V>
如果类中有属性是集合类型,也最好是这三种,
其实这么做挺麻烦,有时候linq用起来就不爽 了。
System.Collections.Generic.List<T> 是针对性能(而非继承)设计的泛型集合。 System.Collections.Generic.List<T> 不包含更便于更改继承类的行为的虚拟成员。 下面的泛型集合是针对继承功能设计的,应公开为 System.Collections.Generic.List<T> 以外的内容。
System.Collections.ObjectModel.Collection<T>
System.Collections.ObjectModel.ReadOnlyCollection<T>
System.Collections.ObjectModel.KeyedCollection<TKey, TItem>
4. CA2227:集合属性应为只读
像下面这样子写,不符合规范,为了保证安全,这种集合不要set了,集合的初始化放在类的构造函数中,需要变更 集合时,调用Add/AddRange等方法。防止把整个集合给New了。
/// <summary>
/// ChildNodes
/// </summary>
private List<FileExplorerData> _childNodes;
/// <summary>
/// ChildNodes
/// </summary>
public override List<FileExplorerData> ChildNodes
{
get
{
return _childNodes;
}
set
{
if (_childNodes != value)
{
_childNodes = value;
}
}
}
其实这样子搞,也带来了一些麻烦。
5. CA1721:属性名不应与 get 方法冲突
这个貌似是为XAML考虑的
例如,类中有个属性叫Icon,还有个方法叫GetIcon(),这是不行的,get是个关键词,敏感啊,改为LoadIcon,就可以了。
6.CA1026:不应使用默认参数
好不容易搞了个默认参数,不用重载了,可惜不符合规范。
CLS 中允许使用默认参数的方法;但是 CLS 允许编译器忽略为这些参数分配的值。 为了跨编程语言维护所需的行为,必须使用提供默认参数的方法重载来替换使用默认参数的方法。
7.CA1021:避免使用 out 参数
过去习惯了在方法中加个Out参数,这个也变成不符合规范了,说法有点冠冕堂皇
通过引用(使用 out 或 ref)传递类型要求具有使用指针的经验,了解值类型和引用类型的不同之处,以及能处理具有多个返回值的方法。 另外,out 和 ref 参数之间的差异没有得到广泛了解。
这,有点...
8.CA1011:考虑将基类型作为参数传递
某个参数我用了UIElement,代码检测说,用DependencyObject就可以了,这个还是不错滴。
9.CA1044:属性不应是只写的
例如:
public bool? IsCheckedWhenInit
{
set
{
// LogHelper.Log("IsCheckedWhenInit:{0} Path:{1}", value, fullPath);
if (_isChecked != value)
{
_isChecked = value;
if (_isChecked == true)
{
checkAllFiles();
}
NotifyPropertyChanged("IsChecked");
}
}
}
虽然可以接受且经常需要使用只读属性,但设计准则禁止使用只写属性。 这是因为允许用户设置值但又禁止该用户查看这个值不能提供任何安全性。 而且,如果没有读访问,将无法查看共享对象的状态,使其用处受到限制。
其实,我是为了方便,呵呵。
做做代码分析还是不错的,可以发现一些小问题。某些比较扯的规范,还是可以忽略的。