我可以有效地使用这种方法吗?
using(SqlCommand cmd = new SqlCommand("GetSomething", new SqlConnection(Config.ConnectionString))
{
cmd.Connection.Open();
// set up parameters and CommandType to StoredProcedure etc. etc.
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
我担心的是:SqlCommand的Dispose方法(在退出using块时调用)是否会关闭底层的SqlConnection对象?
我在项目中使用静态代码分析来检查代码违规.其中一个广泛使用的规则是CA2213,它检查一次性场的正确处理.
我注意到CA2213没有检查处理自动实现的属性.
此外,如果类继承自实现IDisposable的类并且不覆盖Dispose方法,则CA2213不会检查是否处置字段或自动实现的属性.
实际例子:
public sealed class Good : IDisposable {
private Font font;
public Font Font {
get { return font; }
set { font = value; }
}
public Good() { font = new Font("Arial", 9); }
public void Dispose() { /* Do nothing */ } // CA2213
}
public sealed class Bad : IDisposable {
public Font Font { get; set; }
public Bad() { Font = new Font("Arial", 9); }
public void Dispose() { /* Do …Run Code Online (Sandbox Code Playgroud) 对于那些没有时间阅读我对以下问题的推理的人:
有没有办法为方法的参数强制执行"仅新对象"或"仅现有对象"的策略?
有很多方法将对象作为参数,并且方法是否具有对象"all to their"并不重要.例如:
var people = new List<Person>();
Person bob = new Person("Bob");
people.Add(bob);
people.Add(new Person("Larry"));
Run Code Online (Sandbox Code Playgroud)
这里该List<Person>.Add方法采用了"现有" Person(Bob)以及"新" Person(Larry),并且该列表包含两个项目.鲍勃可以作为被访问bob或people[0].Larry可以作为people[1]并且如果需要,可以在larry此后作为(或其他)进行缓存和访问.
好的.但有时一个方法确实不应该传递给新对象.举个例子吧Array.Sort<T>.以下内容并没有多大意义:
Array.Sort<int>(new int[] {5, 6, 3, 7, 2, 1});
Run Code Online (Sandbox Code Playgroud)
所有上面的代码都是采用一个新的数组,对它进行排序,然后忘记它(因为它的引用计数在Array.Sort<int>退出后达到零,因此排序的数组将被垃圾收集,如果我没有记错的话).因此,Array.Sort<T> 期望 "现有"数组作为其参数.
可以想象有其他方法可以期待 "新"对象(尽管我通常认为这样的期望会是设计错误).一个不完美的例子是:
DataTable firstTable = myDataSet.Tables["FirstTable"];
DataTable secondTable = myDataSet.Tables["SecondTable"];
firstTable.Rows.Add(secondTable.Rows[0]);
Run Code Online (Sandbox Code Playgroud)
正如我所说,这不是一个很好的例子,因为DataRowCollection.Add实际上并没有真正期待一个新的 DataRow,确切的; 但它确实期望一个DataRow不属于a的DataTable.所以上面代码中的最后一行不起作用; …
我认同.但是看看asp.net中的内置类:
public sealed class HttpPostedFile
{
public Stream InputStream { get; } // Stream implements IDisposable
// other properties and methods
}
Run Code Online (Sandbox Code Playgroud)
假设我有一个HttpPostedFile被调用的实例file.由于没有Dispose显式调用的方法,file.InputStream.Dispose()因此在被破坏之前不会被调用,我认为这与原来的内涵相违背IDisposable.我认为正确的实现应包含标准IDisposable实现.因此,如果其中一个成员实现IDisposable,该类也需要实现它.你有什么看法?这看起来有点复杂.
.net ×3
c# ×3
dispose ×2
asp.net ×1
asp.net-mvc ×1
fxcop ×1
idisposable ×1
new-operator ×1
parameters ×1
reference ×1
sqlcommand ×1