规则引用笔记
CA2000:丢失范围之前释放对象
原因
创建了 IDisposable 类型的本地对象,但该对象不会被释放,除非对对象的所有引用都超出范围。
默认情况下,此规则会分析整个代码库,但这是可配置的。
如何解决冲突
可使用 using
语句来包装实现 IDisposable 的对象。 以这种方式包装的对象将自动在 using
块的末尾释放。
但是,以下情况不应或不能使用 using
语句进行处理:
-
若要返回一次性对象,必须在块外部的
try/finally
using
块中构造该对象。 -
请勿在
using
语句的构造函数中初始化可释放对象的成员。
案例
var bytearray = new ByteArrayContent(data); //释放对象消除警告 bytearray.Dispose();
CA2234:传递 System.Uri 对象,而不传递字符串
原因
已调用具有字符串参数的方法,该字符串参数的名称包含 “uri”、“Uri”、“urn”、“url”或“Url”,而且该方法的声明类型包含一个具有 System.Uri 参数的相应方法重载。
默认情况下,此规则仅查看外部可见的方法和类型,但这是可配置的。
如何解决冲突
若要解决此规则的冲突,请调用采用 Uri 参数的重载。
案例
class History { internal void AddToHistory(string uriString) { } internal void AddToHistory(Uri uriType) { } } public class Browser { History uriHistory = new History(); public void ErrorProne()//规则冲突 { uriHistory.AddToHistory("http://www.adventure-works.com"); } public void SaferWay()//不冲突方法 { try { Uri newUri = new Uri("http://www.adventure-works.com"); uriHistory.AddToHistory(newUri); } catch (UriFormatException) { } } }
CS0234 :编译器错误
命名空间“namespace”中不存在类型或命名空间名“name”(是否缺少程序集引用?)
案例
Vol.System与System命名空间冲突,解决方案using Sys = System 使用别名Sys.IO解决