Язык 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) )
{
...
}
}
Вместо того, чтобы удалять первые несколько строк, попытайтесь редактировать их, чтобы быть пробелом.
hexedit
программа может сделать это - она читает файлы в блоках, так открытие файла на 10 ГБ не отличается от открытия файла 100 КБ к ней.
$ hexedit largefile.sql.dump
tab (switch to ASCII side)
space (repeat as needed until your header is gone)
F2 (save)/Ctrl-X (save and exit)/Ctrl-C (exit without saving)
Perl может считать файл линию за линией:
жемчуг-pi.bak-e 's/^create индексирует / - создают индекс /'