"尝试"应该在资源分配之前还是之后?

B. *_*non 1 .net c# try-catch

在Delphi世界中,有些人认为至少可以尝试AFTER资源分配,例如:

OracleCommand oc = new OracleCommand(query, con);
try
begin
  oc.CommandType = CommandType.Text;
  String s = oc.ExecuteScalar().ToString();
  try            
    return s;            
    except (on OracleException ex)
    begin
      ShowMessage(ex.Message);
      result := string.Empty;
    end;
end
finally
begin
  con.Close();
  con.Dispose();
end;
Run Code Online (Sandbox Code Playgroud)

它在C#中是相同的,还是应该在资源分配之前"尝试":

try
{
  OracleCommand oc = new OracleCommand(query, con);
  oc.CommandType = CommandType.Text;
  String s = oc.ExecuteScalar().ToString();
  try
  {
    return s;
  }
  catch (OracleException ex)
  {
    MessageBox.Show(ex.Message);
    return string.Empty;
  }
}
finally
{
  con.Close();
  con.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*cin 5

还有一个更好的解决方案:using语句.您可以编写惯用语而不是此代码

using (Connection con = /* some initialization logic */)
{
    try
    {
        using (OracleCommand oc = new OracleCommand(query, con))
        {
            oc.CommandType = CommandType.Text;
            return oc.ExecuteScalar().ToString();
        } // oc is automatically disposed here
    }
    catch (OracleException ex)
    {
        MessageBox.Show(ex.Message);
        return string.Empty;
    }
} // con is automatically disposed here
Run Code Online (Sandbox Code Playgroud)

  • `OracleCommand`也实现了IDisposable. (5认同)