C# 哪种代码编写得更好?

C# 哪种代码编写得更好?,c#,static-code-analysis,C#,Static Code Analysis,我在我们的工具上运行了一个静态代码分析工具,查看它的结果,下面的代码是它讨论的内容之一: SpreadSnapshot oSnap = new SpreadSnapshot(); using (oSnap.SetRowCol(fpSpread, row, col)) { SpreadSetComboBox(fpSpread, list, displayProperty); } using (SpreadSnapshot oSnap = n

我在我们的工具上运行了一个静态代码分析工具,查看它的结果,下面的代码是它讨论的内容之一:

    SpreadSnapshot oSnap = new SpreadSnapshot();
    using (oSnap.SetRowCol(fpSpread, row, col))
    {
        SpreadSetComboBox(fpSpread, list, displayProperty);
    }
    using (SpreadSnapshot oSnap = new SpreadSnapshot())
    {
        oSnap.SetRowCol(fpSpread, row, col);
        SpreadSetComboBox(fpSpread, list, displayProperty);
    }
因此,我将其更改为下面的代码,并修复了该工具所讨论的错误:

    SpreadSnapshot oSnap = new SpreadSnapshot();
    using (oSnap.SetRowCol(fpSpread, row, col))
    {
        SpreadSetComboBox(fpSpread, list, displayProperty);
    }
    using (SpreadSnapshot oSnap = new SpreadSnapshot())
    {
        oSnap.SetRowCol(fpSpread, row, col);
        SpreadSetComboBox(fpSpread, list, displayProperty);
    }
那么在您看来,您认为哪种类型的编码更合适、更不容易出错呢


感谢后者-它确保您不会在
using
语句之后使用
oSnap


除此之外,
SetRowCol
返回一些可丢弃的东西是非常奇怪的。。。这意味着什么呢?

这两个词的意思完全不同,除非
SetRowCol
在结尾返回
this
。首先,处理
SetRowCol
的结果。在第二个示例中,您正在处理
SpreadSnapshot

如果两者都是一次性的,则应同时使用:

using (SpreadSnapshot oSnap = new SpreadSnapshot())
using (oSnap.SetRowCol(fpSpread, row, col))
{
    SpreadSetComboBox(fpSpread, list, displayProperty);
}

存在这样的问题。它说的是什么错误?@KyleTrauberman:这500K代码已经从VB 6.0转换为C#使用一些工具,我们无法再次对所有代码进行检查,所以我们正在重构代码中看到的东西。这很好。我只是说你应该使用一个代码审查网站,因为它们被认为是离题的。这两个例子做的是相同的事情吗?看起来,在第一个示例中,SetRowCol的结果被释放。在第二个示例中,oSnap被释放。我在执行linq to sql(使用DataContext…)时使用using语句。使用using语句和实例化对象有什么区别?@frenchie:这是一个太大的问题,在评论中很难回答,但任何一本好的入门C#书都应该涵盖这一点。我强烈建议您在继续之前仔细阅读using语句…@JonSkeet:谢谢Jon,第一种编码方式也会导致内存泄漏吗?好的,我会的。它会影响性能还是仅仅影响模式/可读性?@frenchie:它会影响资源的自动处理。如果对象具有需要处理的资源并且
SetRowCol
抛出异常,则第一个表单将泄漏(可能是暂时泄漏)。正确,它返回了“this”,因此第一个代码仍然正确。正确的?