Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正确的使用方法;使用;在C中#_C# - Fatal编程技术网

C# 正确的使用方法;使用;在C中#

C# 正确的使用方法;使用;在C中#,c#,C#,我有两套代码,如下所示。我的问题是,我们是否也需要将“using”用于命令和适配器,还是仅用于连接?正确的方法是什么 using (OracleConnection conn = new OracleConnection(ConnectionString)) { conn.Open(); OracleCommand command = new OracleCommand(ProcedureName) { Comma

我有两套代码,如下所示。我的问题是,我们是否也需要将“using”用于命令和适配器,还是仅用于连接?正确的方法是什么

 using (OracleConnection conn = new OracleConnection(ConnectionString))
    {
        conn.Open();
        OracleCommand command = new OracleCommand(ProcedureName)
        {
            CommandType = CommandType.StoredProcedure,
            Connection = conn
        };
        command.Parameters.Add(new OracleParameter("P_ID", OracleDbType.Varchar2, Id, ParameterDirection.Input));
        command.Parameters.Add(new OracleParameter("CUR_OUT", OracleDbType.RefCursor, ParameterDirection.Output));

        OracleDataAdapter adapter = new OracleDataAdapter(command);
        adapter.Fill(dt);
    }
上面的代码只有一个using语句,下面的代码有3个using语句

 using (OracleConnection conn = new OracleConnection(ConnectionString))
    {
        await conn.OpenAsync();
        using (OracleCommand oCommand = new OracleCommand(ProcedureName))
        {
            oCommand.BindByName = true;
            oCommand.CommandType = CommandType.StoredProcedure;
            oCommand.CommandTimeout = await GetCommandTimeout(DatabaseConstants.OracleCommandTimeoutInSeconds);
            oCommand.Connection = conn;

            oCommand.Parameters.Add(new OracleParameter("P_ID", OracleDbType.Varchar2, Id, ParameterDirection.Input));
            oCommand.Parameters.Add(new OracleParameter("CUR_OUT", OracleDbType.RefCursor, ParameterDirection.Output));
            using (OracleDataAdapter oDatAdapter = new OracleDataAdapter(oCommand))
            {
                oDatAdapter.Fill(dataSet);
            }
        }
    }

连接和评论都需要它们。任何实现IDisposable的东西都应该被处理掉

在创建命令之前,无需打开连接。这意味着您可以跳过一组{}

using (for connection)
using (for command)
{
processing
}
这是一个更好,更容易格式化的明智

实际上,我会在一开始就检查是否将其添加到适配器中

还请注意,在当前的C#(撰写本文时为8.0)中,您可以使用using进行变量声明

using var conn = new OracleConnection()

没有()。变量在末尾进行处理。这意味着更少的格式。这称为“使用定义”-

您可以对实现IDisposable接口的所有对象使用
using

  • 如果这些对象是由.net framework管理的,那么在您使用完它们之后,这将是一个明确的销毁它们的调用
  • 如果它们不是由.net frame word管理的,那么您可以通过这种方式来处理它们
您可以在实现IDisposable接口的任何东西上应用using,该接口基本上是try finally语句的包装器,越多越好。您可以使用using,也可以显式调用dispose。使用更安全,因为这样您就不会忘记处理的路径。它看起来也更好。实际上,它插入了一个try-catch-finally块,其中包含一个空的catch块,在finally块中调用dispose。并非所有IDisable对象都需要处理。例如,
SqlConnection
可以安全地关闭,然后让它超出范围。处理阻止在关闭它的基础上重新打开它,这是唯一的区别。再次强调,使用using更安全,因此您不能忘记关闭连接。关于跳过{},我认为明智的做法是始终将它们写出来并明确说明。但这是一个风格问题,每个人都必须找到自己的答案/并不总是使用公司规定。我经常一行接一行地使用,因为如果你有7-8行使用wiith{}和令人非常困惑的行-太多缩进。@TomTom我也需要它作为适配器吗?@Chatra它实现IDisposable了吗?然后是。在vb中,您可以在using指令之后创建idisposable对象的列表。这样可以避免许多缩进。当然,这仅在后续对象不需要更高级别的CTOR时才起作用。即使省略{},也应该缩进。不确定c#是否允许类似的行为。无论如何,使用声明似乎是一个好主意,当它超出范围时进行处置。