2013-08-10 3 views
1

Я новичок в .NET. .NET говорит, что освобождение памяти автоматически обрабатывается, но я прочитал во многих блогах, что, наконец, блок должен использоваться для dbconnections для удаления. Если он автоматически обрабатывается, почему это необходимо. Или, .NET автоматически обрабатывается только для некоторых ресурсов, что исключает dbconnections ?. Просьба уточнить ..Обработка памяти в .NET

+0

К * детерминировано * выбытию памяти. В противном случае это происходит, когда GC обходит его тоже (обычно, когда память находится под давлением) –

+2

Очень рекомендую http://stackoverflow.com/a/538238/90236 –

+0

Соединение db обычно имеет ресурсы на другом конце (a сервер базы данных). На клиенте доступно больше, чем просто память. – Paparazzi

ответ

-1

наконец блок выполняется для очистки ресурсов. Элемент управления передается блоку finally, чтобы избавиться от ресурсов. Сборщик мусора сделает это за вас. Но есть много раз, когда вы явно хотите, чтобы часть кода выполнялась до того, как GC попал в изображение.

Иногда есть сценарии, когда вы хотите, чтобы определенная часть вашего кода исполнялась, даже когда есть исключение, а затем, наконец, попадает в изображение.

0

Вы должны прочитать первый управляемый код и неуправляемых код ..

(dbconnections) System.Data.SqlClient сам управляемый код. Однако он построен поверх нескольких других библиотек. Некоторые из них - управляемый код, а некоторые - нет.

  1. Сам запрос выполняется базой данных. Таким образом, текст запроса (часть, жестко закодированная в вашей программе) будет считаться управляемым кодом, но как только команда будет отправлена ​​в базу данных, она больше не будет управляться.

  2. После выполнения команды .close само соединение освобождается из вашего приложения .net и возвращается в пул соединений (часть OLEDB, ODBC и/или других подсистем). В этот момент соединение освобождается, и неуправляемая часть освобождается. Dispose сделает все, что закрывает, и выпустит другие управляемые части (строка подключения и т. Д.).

Это всегда хорошая идея, чтобы позвонить распоряжаться на любой объект, который реализует его (или обернуть его в использовании блока, как @IRSOG показал). В этом случае не стоит просто просто вызвать close(). Я бы не привык. или использовать (using) блок здесь Более подробную информацию http://www.codeproject.com/Articles/6564/Understanding-the-using-statement-in-C

using (MyResource myRes = new MyResource()) 
{ 
    myRes.DoSomething(); 
} 
2

Как новичок, вам действительно не нужно слишком беспокоиться об этом. В конце концов вам придется больше узнать об этом, но на этом этапе вам нужно понять, что управляемая память обрабатывается инфраструктурой. Вы должны иметь в виду, что когда вы ссылаетесь на память, она будет продолжаться до тех пор, пока не будут выпущены все ссылки, а затем, когда сборщик мусора начнет эту автоматическую очистку памяти.

Есть некоторые объекты, для которых требуются внешние ресурсы, такие как файлы, подключения к базе данных, сетевые подключения (включая веб-запросы), растровые изображения и шрифты и т. Д. Вещи, которые сама отслеживает сама операционная система. Эти объекты обычно реализуют интерфейс, называемый IDisposable, который используется для удаления любых неуправляемых ресурсов.

В принципе, вы смотрите документацию на объект, и если он реализует IDisposable, то вы хотите избавиться от него, как только это станет возможным для вас. Это делается путем вызова Dispose() на нем или неявно с помощью оператора using.

Если вы завершаете ваше соединение db в операторе using, то, наконец, не требуется, поскольку использование interally реализуется с помощью finally. Если вы не используете инструкцию using, вам может понадобиться использовать команду finally для вызова. Это в значительной степени зависит от вас.

Примеры:

using (var dbconn = new SqlConnection()) { 
    // do you data access - no finally required 
} 

или

SqlConnection dbconn; 
try { 
    dbconn = new SqlConnection(); 

    // do your data access 
} 
catch (... various exceptions) {} 
finally 
{ 
    if (dbconn != null) { 
     dbconn.Close(); 
     dbconn.Dispose(); 
    } 
} 
Смежные вопросы