kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Анонимный пользователь
Вопрос

Правильно ли вызывать return внутри оператора {}?

Я просто хочу знать, безопасно ли/хорошо ли вызывать return внутри блока using.

Например.

using(var scope = new TransactionScope())
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}

Мы знаем, что в самой последней фигурной скобке dispose() произойдет отбой. Но что будет в приведенном выше случае, ведь return выводит управление из заданной области видимости (AFAIK)...

  1. Будет ли вызвана моя scope.Complete()?
  2. И так же для метода dispose().
80 2012-08-02T11:59:57+00:00 7
Paolo Moretti
Paolo Moretti
Редактировал вопрос 3-го августа 2012 в 6:11
Программирование
c#
return
using
Решение / Ответ
Øyvind Bråthen
Øyvind Bråthen
2-го августа 2012 в 12:02
2012-08-02T12:02:31+00:00
Дополнительно
Источник
Редактировать
#16852312

Совершенно безопасно вызывать return внутри блока using, поскольку блок using - это просто блок try/finally.

В приведенном вами примере после возврата true область видимости будет утилизирована, а возвращаемое значение. return false, и scope.Complete() не будет **** вызвана. Однако Dispose будет вызван независимо от этого, поскольку он находится внутри блока finally.

Ваш код, по сути, аналогичен этому (если это облегчает понимание):

var scope = new TransactionScope())
try
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}
finally
{
  if( scope != null) 
    ((IDisposable)scope).Dispose();
}

Пожалуйста, имейте в виду, что ваша транзакция никогда не будет зафиксирована, поскольку нет способа добраться до scope.Complete(), чтобы зафиксировать транзакцию.

Øyvind Bråthen
Øyvind Bråthen
Редактировал ответ 3-го августа 2012 в 6:59
123
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
 Lucero
Lucero
2-го августа 2012 в 12:02
2012-08-02T12:02:48+00:00
Дополнительно
Источник
Редактировать
#16852313

Это нормально - клаузы finally (а именно это делает закрывающая фигурная скобка клаузы using) всегда выполняются при выходе из области видимости, независимо от того, каким образом.

Однако это справедливо только для операторов, находящихся в блоке finally (который нельзя явно задать при использовании using). Поэтому в вашем примере scope.Complete() никогда не будет вызвано (я ожидаю, что компилятор все же предупредит вас о недостижимом коде).

6
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
Tony Kh
Tony Kh
2-го августа 2012 в 12:07
2012-08-02T12:07:48+00:00
Дополнительно
Источник
Редактировать
#16852317

область.В комплекте обязательно должен быть вызван перед возвращение. Компилятор выдаст предупреждение и этот код никогда не будет вызван.

Что касается "вернуть" себя - да, ее с уверенностью можно назвать его внутри использование заявление. Используя переведен на попробовать-наконец-то блок За сценой и, наконец, блок должен быть безусловно выполнены.

2
0
M.  Mennan Kara
M. Mennan Kara
2-го августа 2012 в 12:03
2012-08-02T12:03:17+00:00
Дополнительно
Источник
Редактировать
#16852314

В целом, это хороший подход. Но в вашем случае, если вы вернетесь до вызова scope.Complete(), это просто уничтожит TransactionScope. Зависит от вашего дизайна.

Так, в данном примере Complete() не вызывается, а scope утилизируется, предполагая, что он наследует интерфейс IDisposable.

2
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
 Aristos
Aristos
2-го августа 2012 в 12:04
2012-08-02T12:04:12+00:00
Дополнительно
Источник
Редактировать
#16852315

Чтобы убедиться, что масштабы.Полный () будет называться, оберните его попробовать/наконец-то. В распоряжаться называется потому, что вы обернуть его с помощьюэтоблок try/наконец-то`.

using(var scope = new TransactionScope())
{
  try
  {
  // my core logic
  return true; // if condition met else
  return false;
  }
  finally
  {
   scope.Complete();
  }
}
 Aristos
Aristos
Редактировал ответ 16-го января 2017 в 10:17
1
0
 daryal
daryal
2-го августа 2012 в 12:09
2012-08-02T12:09:49+00:00
Дополнительно
Источник
Редактировать
#16852318

В примере вы указали, есть проблема, масштабы.Полный () никогда не называют. Во-вторых, это не хорошая практика, чтобы использовать возвращение инструкция, используя отчетность. Обратитесь к следующим:

using(var scope = new TransactionScope())
{
    //have some logic here
    return scope;      
}

В этом простом примере, суть в том, что, значение сфера будет null при использовании инструкция закончена.

Так что лучше не возвращаться внутрь с помощью заявления.

1
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
 ThunderGr
ThunderGr
2-го августа 2012 в 12:07
2012-08-02T12:07:35+00:00
Дополнительно
Источник
Редактировать
#16852316

В этом примере область.Полный() никогда не будет выполняться. Однако, команда возврата будет очистка всего, что назначенные на стек. ГК будет заботиться о все, что неиспользуемая. Так что, если есть объект, который не может быть подобран ГК, нет никаких проблем.

0
0
Похожие сообщества 6
Microsoft Stack Jobs
Microsoft Stack Jobs
2 400 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 329 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 765 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
var chat = new Chat();
var chat = new Chat();
1 626 пользователей
Обсуждение .NET / C# / F# Обсуждение Azure — @azurechat Прочие обсуждения – https://t.me/+zwxI91RGG6s2YzAy
Открыть telegram
C#/.NET Для Новичков
C#/.NET Для Новичков
294 пользователей
Группа создана для тех, кто изучает язык программирования C#. Верховный главнокомандующий: @BlackDeveloper Оффтоп - разрешен в меру, реклама - бан.
Открыть telegram
ext
ext
64 пользователей
Общение на темы YouTube канала и программирования. Вакансии не размещаем. Основной канал: @extremecode
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Александр Македонский
Зарегистрирован 6 дней назад
2
Andrei Kalinin
Зарегистрирован 3 недели назад
3
Koroleva Ego
Зарегистрирован 1 месяц назад
4
Star Lenon
Зарегистрирован 1 месяц назад
5
Данил Жевнеров
Зарегистрирован 2 месяца назад
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией