相关疑难解决方法(0)

SqlCommand.Dispose是否关闭连接?

我可以有效地使用这种方法吗?

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对象?

.net garbage-collection dispose sqlcommand sqlconnection

51
推荐指数
2
解决办法
4万
查看次数

CA2213代码分析规则和自动实现的属性

我在项目中使用静态代码分析来检查代码违规.其中一个广泛使用的规则是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)

c# dispose fxcop static-analysis

15
推荐指数
2
解决办法
1716
查看次数

我能否检测到我是否已将新对象作为参数?

精简版

对于那些没有时间阅读我对以下问题的推理的人:

有没有办法为方法的参数强制执行"仅新对象"或"仅现有对象"的策略

长版

有很多方法将对象作为参数,并且方法是否具有对象"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),并且该列表包含两个项目.鲍勃可以作为被访问bobpeople[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.所以上面代码中的最后一行不起作用; …

.net c# parameters reference new-operator

8
推荐指数
3
解决办法
327
查看次数

如果一个成员是IDisposable,我们应该实现IDisposable

我认同.但是看看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 c# asp.net asp.net-mvc idisposable

4
推荐指数
1
解决办法
572
查看次数