在我之前的一个问题中,有人建议我不要使用trycatch并最终关闭连接,而应该使用"using".有人能给我举个例子吗?

我有这个代码,我怎么用它呢?

            try
            {
                conn3.Open();
                string sql_check = "SELECT (time_in) FROM timeinout WHERE employee_id = @employee_id AND date = @date";
                using var cmd_check = new NpgsqlCommand(sql_check, conn3);

                cmd_check.Parameters.AddWithValue("employee_id", id);
                cmd_check.Parameters.AddWithValue("date", date);
                cmd_check.Prepare();

                var reader = cmd_check.ExecuteReader();

                if (reader.Read())
                {
                    return true;
                }
                else
                {
                    return false;
                }

            }
            catch
            {
                return false;
            }
            finally
            {
                conn3.Close();
            }

推荐答案

using不是try...catch...finally的替代品.它使您能够go 掉finally块,但如果可以抛出异常,您仍然需要捕获它.using块保证创建的对象将被释放,无论是否引发异常.这:

var obj = new SomeType();

try
{
    // Use obj here.
}
catch
{
    // Handle exception here.
}
finally
{
    obj.Dispose();
}

可以并且应该用以下内容替换:

using (obj = new SomeType())
{
    try
    {
        // Use obj here.
    }
    catch
    {
        // Handle exception here.
    }
}

基本上,如果已经有异常处理,那么仍然需要异常处理,但不需要关闭/处理finally块中本地创建的对象.如果你在finally街区做其他事情,那么你仍然需要它.

在您的情况下,您应该用using条语句创建连接、命令和数据读取器:

using (var connection = new NpgsqlConnection(connectionString))
using (var command = new NpgsqlCommand(query, connection))
{
    try
    {
        connection.Open();

        using (var reader = command.ExecuteReader())
        {
            return reader.HasRows;
        }
    }
    catch
    {
        return false;
    }
}

数据读取器将在内部using块的末端关闭,连接将在外部using块的末端关闭.

Csharp相关问答推荐

如果第一个匹配项为空,则规则运算不会拆分C#中分离字符串上的子菜单

PostingAsJsonAschange在从调用的方法返回时给出500错误

Blazor:用参数创建根路径

EF Core Fluent API中定义的多对多关系

ListaryImportProperty的默认DllImportSearchPathsProperty行为

总是丢弃返回的任务和使方法puc无效之间有区别吗?

EF Core判断是否应用了AsSplitQuery()

Entity Framework Core 8 dbcontext—无法以多对多关系添加某些行'

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

dotnet集合中内部数组的局部变量副本的用途是什么?'

在具有主构造函数的类中初始化属性时出现警告

为什么任务需要在内部使用ManualResetEventSlim?

ASP.NET配置kestrel以使用Windows证书存储中的HTTPS

为什么C#认为这个非托管 struct 有一个重叠

在两个已具有一对多关系的表之间添加另一个一对多关系

JsonPath在Newtonsoft.Json';S实现中的赋值

正在try 将自定义字体添加到我的控制台应用程序

为什么连接到Google OAuth2后,结果.Credential为空?

如何使ExecuteAsync异步运行

如何在C#中反序列化Java持续时间?