以下模式是否可以接受?

时间:2011-06-30 09:32:25

标签: c# design-patterns

我正在尝试使用企业库从数据库中读取数据的可接受模式。您如何考虑以下模式(我的意思是,finally块中的空值检查?)

IDataReader NewReader = null;

try
{
    NewReader = (SqlDataReader)(SqlDatabase.ExecuteReader(SqlCommand));

    /* Do some work with NewReader. */

    NewReader.Close();
}
catch /* As much 'catch' blocks as necessary */
{
    /* Handle exceptions */
}
finally
{
    if (!ReferenceEquals(NewReader, null))
    {
        NewReader.Dispose();
    }
}

这种空检查是否可以接受,或者是否有更优雅的方法来解决这个问题?

4 个答案:

答案 0 :(得分:5)

我会使用if(NewReader == null)。这是检查null的默认方式。你这样做的方式是一样的,但它看起来很奇怪,因此可能会让人感到困惑。

此外:你为什么不使用using?使您的代码更清洁:

try
{
    using(IDataReader NewReader = (SqlDataReader)(SqlDatabase.ExecuteReader(SqlCommand)))
    {
        /* Do some work with NewReader. */
    }
}
catch /* As much 'catch' blocks as necessary */
{
    /* Handle exceptions */
}

答案 1 :(得分:4)

与以下内容相同:

if (NewReader != null) ... 

我更喜欢从造型的角度来看。

<强>更新

由于NewReader看似实现IDisposable,只需将其包装在using构造中。

示例:

using (var r = new ReaderSomething())
{
  try
  {
  }
  catch {}
}

答案 2 :(得分:3)

我更喜欢使用“using”块:

using(<your reader object>)
{
   //read data from reader
}

答案 3 :(得分:0)

只是为人们上面所说的内容添加一些细节......

使用using块,无论是否发生异常,都会自动调用Dispose方法,因为IDataReader的实现也必须实现IDisposable。