Получу ли я преимущества Dispose, если использую, инициализирую с нулем? - PullRequest
0 голосов
/ 19 марта 2019

Я хотел бы изменить свой код SqlDataReader, чтобы он использовал using ..

SqlDataReader reader = null;
reader = xdCmd.ExecuteReader();
// use reader..

Могу ли я использовать решение 1), где я объявляю reader при использовании, а затем сначала инициализирую его с SqlDataReader, и все же получаю Dispose "функции", использующие предоставляемые? Или мне нужно сделать это как в решении 2), где инициализация происходит сразу, в using? Я предполагаю, что 1) хорошо, но я не уверен.

1)

using (SqlDataReader reader = null)
{
    xdCmd.CommandText = $"select * from {tableName}";
    reader = xdCmd.ExecuteReader();
    // use reader..
}

2)

using (SqlDataReader reader = new SqlDataReader(new SqlCommand($"select * from {tableName}"), xdCon))
{
    reader = xdCmd.ExecuteReader();
    // use reader..
}

Ответы [ 2 ]

3 голосов
/ 19 марта 2019

Язык C # не включает синтаксис для выражения концепции "владения" объектом или управления временем жизни в отличие от Rust, поэтому от документации API зависит, принимает ли конструктор объекта свои аргументы или нет (и, следовательно, ктополучает возможность позвонить .Dispose()).Это не то, что компилятор C # может определить для вас.Однако реализации .Dispose() должны быть идемпотентными в любом случае , поэтому нет никакого вреда при вызове .Dispose() многократных (избыточных) раз.

Просто следуйте идиоматическим соглашениям C # для сложенных using операторов:

using( SqlConnection c = new SqlConnection( connectionString ) )
using( SqlCommand cmd = c.CreateCommand() )
{
    await c.OpenAsync().ConfigureAwait(false);

    cmd.CommandText = "SELECT foo, bar FROM baz";

    using( SqlDataReader rdr = await cmd.ExecuteReaderAsync().ConfigureAwait(false) )
    {
        ...
    }
} 
0 голосов
/ 19 марта 2019

для меня, я предпочитаю использовать второе решение, оно более тонкое, или вы можете использовать мой пример чуть ниже:

using (var sqlConnection = new SqlConnection(connection))
{
       using (var command = new SqlCommand(query, sqlConnection))
       {
            using (var read = command.ExecuteReader())
            {
                // process on your read
            }
       }
}
...