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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что-то типа Result 
:(
    Опции темы
Vit
Дата 15.4.2007, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


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

Репутация: 1
Всего: 207



Извиняюсь, но у меня наследие в ввиде многолетнего програмирования на Дельфи, поэтому приходится искать некоторые конструкции, которые привычны в Дельфи, но отсуствуют или как-то по другому реализованы в C#.

Вот такая вот проблема, на Дельфи пишу следующий код:

Код

Function GetSomething:integer;
begin
  query.... // открываю запрос, передаю параметры и т.п.
  Result := query.fields[0].asInteger; // это результат функции
  query.close...// тут мне надо закрыть запрос, закрыть коннект и т.п.
end;


Теперь допустим я это делаю на c#:
Код

int GetSomething();
{
  query.... // открываю запрос, передаю параметры и т.п.
  return query.... // это результат функции
  Query.close...// тут мне надо закрыть запрос, закрыть коннект и т.п. 
}


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



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Hurricane
Дата 15.4.2007, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сохраняешь в временную переменную и возвращаешь ее.

Код

int GetSomething();
{
  query.... // открываю запрос, передаю параметры и т.п.
  int Result = query.... // это результат функции
  Query.close...// тут мне надо закрыть запрос, закрыть коннект и т.п. 

  return Result;
}


PM MAIL   Вверх
Vit
Дата 15.4.2007, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


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

Репутация: 1
Всего: 207



другими словами без дополнительной переменной не обойтись...  А если возвращается тип объект? Тут компиллятор начинает ругаться дурным голосом что не может вернуть локально объявленный объект...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Hurricane
Дата 15.4.2007, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Код

QueryResult GetSomething();
{
  query.... // открываю запрос, передаю параметры и т.п.
  QueryResult queryResult = new QueryResult( query.... )// это результат функции
  Query.close...// тут мне надо закрыть запрос, закрыть коннект и т.п. 

  return queryResult;
}


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


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


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

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



try..finally для этого и придуман.
Код

Query query;
try
{
  query = new Query(....); // открываю запрос, передаю параметры и т.п.
  return query;
}
finally
{
  Query.close ();
}



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


Java-ненавистник :)
****


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

Репутация: 24
Всего: 93



Vit, реализуй для Query (если это твой класс, а если не твой -- то есть шанс, что он уже реализован) интерфейс IDisposable с методом Dispose вызывающим Close и тогда можно будет записывать так:

Код
using (Query query = new Query(...))
{
    // делаем что-нибудь
     return query...;
}


Это полностью аналогично тому, что привёл mr.DUDA, но просто более удобная запись.

Это сообщение отредактировал(а) Дрон - 15.4.2007, 10:06


--------------------
Да. Именно так.
PM   Вверх
mr.DUDA
Дата 15.4.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Забыл про юзинг, этот вариант действительно удобнее (при условии что объект реализует IDisposable)


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


Vitaly Nevzorov
****


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

Репутация: 1
Всего: 207



Всем спасибо!


Цитата(Дрон @  15.4.2007,  01:06 Найти цитируемый пост)
Vit, реализуй для Query (если это твой класс, а если не твой -- то есть шанс, что он уже реализован) интерфейс IDisposable с методом Dispose вызывающим Close и тогда можно будет записывать так:



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


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Exception
Дата 15.4.2007, 21:51 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 29
Всего: 186



Интерфейс IDisposable предназначен для реализации объектом поведения "мне нужно освободить ресурсы". Он становится необходим, так как финалайзеры в .NET (что-то вроде деструкторов C++) выполняются только при сборке мусора, то бишь фиг знает когда. Если же класс реализует IDisposable, это "говорит" его клиентам, что после использования его объектов нужно вызвать единственный метод этого интерфейса -- Dispose ().

Код
class DisposableClass : IDisposable
{
    private bool _disposed; // нам ведь не нужно освобождать ресурсы дважды!

    public void Dispose ()
    {
        if (!_disposed)
        {
            // прибираемся, освобождаем занятые объектом ресурсы
        }
    }

    ~DisposableClass () // вдруг никто не вызвал метод Dispose ()?
    {
        this.Dispose ();
    }
}


Использование объекта:

Код
DisposableClass something = new DisposableClass ();
// делаем что-то с объектом
// ...
// когда он уже не нужен, вызываем Dispose ()
something.Dispose ();


А что если во время работы с объектом произойдёт исключение? Тогда мы можем и не "добраться" до вызова Dispose (), то бишь не сможем освободить ресурсы! Это нехорошо, поэтому обернём наш код в конструкцию try-catch-finally:

Код
DisposableClass something = new DisposableClass ();
try
{
    // делаем что-то с объектом
    // ...
}
finally // блок finally выполнится даже если произойдёт исключение при работе с объектом
{
    something.Dispose ();
}


Однако, есть конструкция using, которая делает то же самое, но более наглядно:

Код

using (something = new DisposableClass ()) // создаёт экземпляр переменной
{
    // делаем что-то с объектом
    // ...
} // по выходе из конструкции using вызывается тот самый метод Dispose () 


Разумеется, множество классов уже реализовали интерфейс IDisposable.

Пример:

Код

using (OleDbConnection con = new OleDbConnection (connectionString))
{
    con.Open ();
    // ...
    con.Close ();
}


А тебе нужно вот что (как и сказал Дрон):

Код
using (Query query = new Query(...))
{
    // делаем что-нибудь
     return query...;
}


Это сообщение отредактировал(а) Exception - 15.4.2007, 21:52
PM   Вверх
mr.DUDA
Дата 15.4.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Exception, молодчаго !!!

Vit, не так всё потеряно, как может показаться, а твои скиллы в делфях лично для меня очень сильно прокачанные и некоторые статьи из Dephi FAQ много помогли, так что зря себя оговариваешь ! 20 и даже 30 - это не предел ! Спасибо что ты с нами - то бишь в разделе под дотнет, а не в жабистах.  smile 


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


Vitaly Nevzorov
****


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

Репутация: 1
Всего: 207



Цитата(mr.DUDA @  15.4.2007,  12:58 Найти цитируемый пост)
так что зря себя оговариваешь 


Я не оговариваю, к сожалению с возрастом значительно затрудняется изучение нового материала, это вполне объективный показатель. Естественно что опыт в Дельфи и в базах данных помогает, без него я бы вообще не смог ничего выучить, но восприятие нового это не сильно ускоряет.

Цитата(mr.DUDA @  15.4.2007,  12:58 Найти цитируемый пост)
20 и даже 30 - это не предел 


мне уже почти 40...

Цитата(mr.DUDA @  15.4.2007,  12:58 Найти цитируемый пост)
Спасибо что ты с нами - то бишь в разделе под дотнет, а не в жабистах.  


Нет, токо не джаба... мне с ними не попути...



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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