Когда целесообразно контролировать сборку мусора в C#
Я работаю над службой Windows в C#, которая в основном сканирует определенный каталог для вновь созданных файлов. Если файл был создан, строка имени файла разделяется и определенная подстрока имени файла используется для запроса базы данных SQL. Поскольку этот сервис работает постоянно, я хочу, чтобы он был максимально дружественным по отношению к памяти, и поэтому мне сказали использовать автоматическую сборку мусора при использовании объектов SqlDataAdapter и DataTable. Примите во внимание следующий код:
using (SqlDataAdapter da = new SqlDataAdapter(cmdstring, con))
{
using (DataTable dt = new DataTable())
{
da.Fill(dt);
if (dt.Rows.Count != 0)
{
splitlst.Add(dt.Rows[0][0].ToString());//kunde
splitlst.Add(dt.Rows[0][1].ToString());
splitlst.Add(dt.Rows[0][2].ToString());
splitlst.Add(dt.Rows[0][3].ToString());
splitlst.Add(dt.Rows[0][4].ToString());
splitlst.Add(dt.Rows[0][5].ToString());
}
}
}
Это эффективный способ сбора мусора? Я не очень-то привык работать таким образом, поэтому, если бы кто-нибудь мог заставить меня понять, когда намеренно контролировать сборку мусора, я был бы очень признателен.
1 ответ
Код хорош; но по неправильным причинам (вроде).
Мне сказали использовать автоматическую сборку мусора
Немного остроумно, вам не нужно явно использовать автоматическую сборку мусора. Потому что это автоматически.
using
блоки используются для размещения объектов (которые реализуют IDisposable
интерфейс).
Намерение (снижение использования памяти) здесь то же самое. Многие одноразовые предметы освобождают свои данные; так что автоматический сборщик мусора может очистить его, когда захочет.
Как очень незначительный комментарий, вы можете уменьшить вложенность, опуская скобки сверху using
заявление:
using (SqlDataAdapter da = new SqlDataAdapter(cmdstring, con))
using (DataTable dt = new DataTable())
{
da.Fill(dt);
if (dt.Rows.Count != 0)
{
splitlst.Add(dt.Rows[0][0].ToString());//kunde
splitlst.Add(dt.Rows[0][1].ToString());
splitlst.Add(dt.Rows[0][2].ToString());
splitlst.Add(dt.Rows[0][3].ToString());
splitlst.Add(dt.Rows[0][4].ToString());
splitlst.Add(dt.Rows[0][5].ToString());
}
}
Аналогично другим блокам кода (if
, foreach
,...), скобки не нужны для одной строки кода.
Технически, вам все равно нужно сделать отступ. Похоже на выполнение:
if(1 + 1 != 2)
BurnMathBooks(); //still indented
Технически вы также должны сделать:
using (SqlDataAdapter da = new SqlDataAdapter(cmdstring, con))
using (DataTable dt = new DataTable()) //still indented
{
//...
}
Но поскольку отсутствие отступов на самом деле не делает код более нечитаемым; допустимо опустить это в этом случае.
using (SqlDataAdapter da = new SqlDataAdapter(cmdstring, con))
using (DataTable dt = new DataTable())
{
//...
}