CodeQL 文档

错失“using”机会

ID: cs/missed-using-statement
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - maintainability
   - language-features
Query suites:
   - csharp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

良好的做法是(并且通常对于正确性至关重要)在程序不再需要资源(例如文件句柄、图形句柄或数据库连接)时释放它们。对于仅在单个方法中使用的资源,常见的习惯用法是将使用该资源的代码括在 try 块中,并在 tryfinally 块中释放该资源。这种习惯用法实际上非常普遍,以至于 C# 以 using 语句的形式为其提供了一种更短、更简洁的语法。

建议

鉴于在这种情况下提供了显式语言支持,因此更习惯于使用 using 语句,而不是 try-finally 技术;它还有助于向其他程序员清楚地传达代码的意图。

示例

在此示例中,使用 try 块来确保即使程序引发异常也能释放资源。

class MissedUsingOpportunity
{
    static void Main(string[] args)
    {
        StreamReader reader = null;
        try
        {
            reader = File.OpenText("input.txt");
            // ...
        }
        finally
        {
            if (reader != null)
            {
                ((IDisposable)reader).Dispose();
            }
        }
    }
}

可以通过使用 using 块来大大简化该示例。

class MissedUsingOpportunityFix
{
    static void Main(string[] args)
    {
        using (StreamReader reader = File.OpenText("input.txt"))
        {
            // ...
        }
    }
}

参考

  • MSDN:using 语句

  • J. Albahari 和 B. Albahari,《C# 4.0 简明教程 - 权威参考》,第 138 页。

  • ©GitHub 公司
  • 条款
  • 隐私