Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> using(...), Вопрос 
V
    Опции темы
Prehistorik
Дата 14.8.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 30.5.2006
Где: СПб

Репутация: 2
Всего: 3



Код

      try
      {
        using (OleDbConnection cnn = new OleDbConnection ( cnnStr ))
        {
          cnn.Open ( );
          OleDbCommand cmd = new OleDbCommand ( "select * fffff", cnn );//Намерянно неправильный запрос.
          cmd.ExecuteNonQuery ( );
          cnn.Close ( );
        }
        //Что происходит с памятью, выделенной под объект cnn
      }
      catch
      {
        //Что здесь происходит c коннекцией если учесть неправильноть запрооса?
      }


Соответственно два вопроса... И если есть более подробное объяснение работы инструкции using чем в МэСэДэЭне... То буду благодарен ))
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
ivashkanet
Дата 14.8.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Prehistorik, Void моного раз постил про using. Поищи, плиз.
Цитата(Prehistorik @  14.8.2006,  13:46 Найти цитируемый пост)
//Что происходит с памятью, выделенной под объект cnn

Все зависит от того, насколько правильно в классе определен деструктор-финализатор -- Finalize().
Цитата(Prehistorik @  14.8.2006,  13:46 Найти цитируемый пост)
//Что здесь происходит c коннекцией если учесть неправильноть запрооса?

Метод finalize все равно будет вызван.
Твой код соответствует коду:
Код

      try
      {
          OleDbConnection cnn = new OleDbConnection ( cnnStr ))
         try
        {
          cnn.Open ( );
          OleDbCommand cmd = new OleDbCommand ( "select * fffff", cnn );//Намерянно неправильный запрос.
          cmd.ExecuteNonQuery ( );
          cnn.Close ( );
        }
        catch
        {
          cnn.Finalize()
        }
        //Что происходит с памятью, выделенной под объект cnn
      }
      catch
      {
        //Что здесь происходит c коннекцией если учесть неправильноть запрооса?
      }


Вроде так smile

Это сообщение отредактировал(а) ivashkanet - 14.8.2006, 14:04
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 14.8.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



При любом выходе за пределы using-а (в т.ч. при генерации исключения) происходит вызов cnn.Dispose; это в свою очередь ведёт к проверке, закрыто ли соединение - и если не закрыто, то к вызову cnn.Close().

Если выход из using-а нормальный - то после Dispose() cnn помечается как неиспользуемый, т.к. ссылок на него больше нет (он объявлен в области видимости using-а), и сборщик мусора заметёт его при следующей сборке.

Если выход - по исключению, то происходит то же самое. Кстати, директива using не съедает исключений (если кто-нибудь не знает), т.е. не обрабатывает их сама.

Добавлено @ 14:01 
Цитата(ivashkanet @  14.8.2006,  13:57 Найти цитируемый пост)
Метод finalize все равно будет вызван.

Метод Finalize() aka деструктор будет вызван при сборке мусора.

Добавлено @ 14:03 
ivashkanet, обрати внимание, что твой код ест исключения smile:
Код
         try
        {
          cnn.Open ( );
          OleDbCommand cmd = new OleDbCommand ( "select * fffff", cnn );//Намерянно неправильный запрос.
          cmd.ExecuteNonQuery ( );
          cnn.Close ( );
        }
        catсh
        {
          cnn.Finalize()

// ??????????? А где throw ???????????????
        }

И повторюсь, не Finalize(), а Dispose().


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 14.8.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



mr.DUDA, вы как всегда правы сэр smile 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 14.8.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ivashkanet @  14.8.2006,  14:06 Найти цитируемый пост)
mr.DUDA, вы как всегда правы сэр

 smile 

З.Ы. матчасть читать надо почаще, хотя бы ту книжку что закреплена в теме выше  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 14.8.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Код
      try
      {
          OleDbConnection cnn = new OleDbConnection ( cnnStr ))
         try
        {
          cnn.Open ( );
          OleDbCommand cmd = new OleDbCommand ( "select * fffff", cnn );//Намерянно неправильный запрос.
          cmd.ExecuteNonQuery ( );
          cnn.Close ( );
        }
        catch (Exception e)
        {
          cnn.Dispose();
          throw e;
        }
        //Что происходит с памятью, выделенной под объект cnn
      }
      catch
      {
        //Что здесь происходит c коннекцией если учесть неправильноть запрооса?
      }


PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 14.8.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Код
        catch
        {
          cnn.Dispose();
          throw;
        }

а так короче smile

Код
        finally
        {
          cnn.Dispose();
        }

а так логичнее smile



--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 14.8.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Все не буду больше давать поспешных решений smile 
PM MAIL WWW ICQ   Вверх
Prehistorik
Дата 16.8.2006, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 30.5.2006
Где: СПб

Репутация: 2
Всего: 3



ivashkanet, 
mr.DUDA, респект и уважуха. Спасибо за разъяснения.
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0702 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.