Как лучше делать выход из if-then?
Проверяется наличие каталога, если он есть, то нужно выполнить команды после fi, если нет (else) — создать каталог. Как лучше прекратить выполнение if-then в случае наличия каталога? Я не придумал ничего лучше, чем сделать так:
if [ -d "$TRUNK_NAME" ] then : else mkdir $TRUNK_NAME fi
cr0x
26.04.12 17:39:34 MSK
[ ! -d "$TRUNK_NAME" ] && mkdir "$TRUNK_NAME"
backbone ★★★★★
( 26.04.12 17:43:01 MSK )
if [ ! -d "папка" ]; then echo "нету папки. " fi
anonymous
( 26.04.12 17:43:57 MSK )
Ответ на: комментарий от backbone 26.04.12 17:43:01 MSK
Ойбл, а я ! перед скобкой тыкал и удивлялся почему не работает. Ладно, спасибо.
cr0x
( 26.04.12 17:44:45 MSK ) автор топика
ABW ★★★★★
( 26.04.12 17:49:10 MSK )
Тут другой вопрос — нужно ли выходить из if.
Всегда мучает вопрос — что лучше — выполнить тело функции внутри if или после.
if x!=0 then z = y/x return z else return $error endif
if x==0 then return $error endif z = y/x return z
Suntechnic ★★★★★
( 26.04.12 17:49:55 MSK )
Ответ на: комментарий от Suntechnic 26.04.12 17:49:55 MSK
Надеюсь понятно что это диалект клингонского.
Suntechnic ★★★★★
( 26.04.12 17:50:59 MSK )
Ответ на: комментарий от Suntechnic 26.04.12 17:50:59 MSK
Если у тебя есть некий блок кода (функция, например), из которого нужно выходить в случае чего (ошибки, например), то тело пиши после if. А если есть возможность обрабатывать исключения — выходи из функции сигнализировав исключение. Ку?
Zorn
( 26.04.12 18:28:16 MSK )
[ -d "$TRUNK_NAME" ] || mkdir "$TRUNK_NAME"
mkdir -p "$TRUNK_NAME"
А ещё есть true, false и ;
schizoid ★★★
( 26.04.12 19:41:51 MSK )
Ответ на: комментарий от Zorn 26.04.12 18:28:16 MSK
С исключениями очевидно. Но почему тело после if? Вроде как тело внутри if выглядит более логичным — всегда ясно что мы обработали все что нужно в if. С другой стороны я так делаю только если функция в 3-4 строки, а в остальных случаях пишу после if — типа вначале все обработали и «гуляем» спокойно.
Suntechnic ★★★★★
( 26.04.12 21:17:08 MSK )
Щас придут лисперы и подробно тебе объяснят на десяти страницах.
anonymous
( 26.04.12 21:24:45 MSK )
а зачем проверять?
mkdir -p $TRUNK_NAME
lazyklimm ★★★★★
( 27.04.12 00:37:57 MSK )
Ответ на: комментарий от Suntechnic 26.04.12 17:49:55 MSK
Конечно же только второй вариант. Он даже чисто визуально менее загроможден, такой код легче читать. Представь ситуацию, тебе надо понять код
if condishion then /* тут двадцать строк кода */ else return $error
К тому моменту как ты дочитаешь до else, врубаясь в алгоритм, ты потеряешь контекст и прийдется отматывать назад, чтоб посмотреть почему кидается ошибка.
Насколько лаконичней и элегантней смотрится
if not condition return $error /* тут код */ return $result
Yur4eg ★★
( 28.04.12 11:51:22 MSK )
Ответ на: комментарий от Yur4eg 28.04.12 11:51:22 MSK
Ну вот поэтому в больших функциях так и делаю. Но хотелось единообразия. Раз такой вариант набрал больше всего голосов — буду использовать его все время.
Операторы перехода — break , continue , return и goto
Операторы перехода безоговорочно передают управление. Оператор break завершает ближайшее заключающее оператор итерации или switch инструкцию. Оператор continue запускает новую итерацию ближайшего заключенного оператора итерации. Оператор return завершает выполнение функции, в которой она отображается, и возвращает элемент управления вызывающему объекту. Оператор goto передает элемент управления инструкции, помеченной меткой.
Инструкция break
Оператор break завершает выполнение ближайшего внешнего оператора итерации (то есть цикла for , foreach , while или do ) или оператора switch . Оператор break передает управление оператору, который расположен после завершенного оператора (если таковой есть).
int[] numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; foreach (int number in numbers) < if (number == 3) < break; >Console.Write($" "); > Console.WriteLine(); Console.WriteLine("End of the example."); // Output: // 0 1 2 // End of the example.
Во вложенных циклах оператор break завершает только самый внутренний цикл, содержащий его, как показано в следующем примере:
for (int outer = 0; outer < 5; outer++) < for (int inner = 0; inner < 5; inner++) < if (inner >outer) < break; >Console.Write($" "); > Console.WriteLine(); > // Output: // 0 // 0 1 // 0 1 2 // 0 1 2 3 // 0 1 2 3 4
При использовании оператора switch внутри цикла оператор break в конце раздела switch передает управление только из оператора switch . Цикл, содержащий оператор switch , не затрагивается, как показано в следующем примере:
double[] measurements = [-4, 5, 30, double.NaN]; foreach (double measurement in measurements) < switch (measurement) < case < 0.0: Console.WriteLine($"Measured value is ; too low."); break; case > 15.0: Console.WriteLine($"Measured value is ; too high."); break; case double.NaN: Console.WriteLine("Failed measurement."); break; default: Console.WriteLine($"Measured value is ."); break; > > // Output: // Measured value is -4; too low. // Measured value is 5. // Measured value is 30; too high. // Failed measurement.
Инструкция continue
Оператор continue начинает новую итерацию ближайшего внешнего оператора итерации (то есть цикла for , foreach , while или do ), как показано в следующем примере:
for (int i = 0; i < 5; i++) < Console.Write($"Iteration : "); if (i < 3) < Console.WriteLine("skip"); continue; >Console.WriteLine("done"); > // Output: // Iteration 0: skip // Iteration 1: skip // Iteration 2: skip // Iteration 3: done // Iteration 4: done
Инструкция return
Оператор return завершает выполнение метода, в котором он присутствует, и возвращает управление и результат функции (при его наличии) вызывавшему методу.
Если член функции не вычисляет значение, используется оператор return без выражения, как показано в следующем примере:
Console.WriteLine("First call:"); DisplayIfNecessary(6); Console.WriteLine("Second call:"); DisplayIfNecessary(5); void DisplayIfNecessary(int number) < if (number % 2 == 0) < return; >Console.WriteLine(number); > // Output: // First call: // Second call: // 5
Как показано в предыдущем примере, для досрочного завершения члена функции обычно используется оператор return без выражения. Если член функции не содержит оператор return , он завершается после выполнения последнего оператора.
Если член функции вычисляет значение, используется оператор return с выражением, как показано в следующем примере:
double surfaceArea = CalculateCylinderSurfaceArea(1, 1); Console.WriteLine($""); // output: 12.57 double CalculateCylinderSurfaceArea(double baseRadius, double height)
Если оператор return содержит выражение, это выражение должно допускать неявное преобразование в тип возвращаемого значения члена функции, если только он не является асинхронным. Выражение, возвращаемое функцией async , должно быть неявно преобразовано в аргумент Task типа или ValueTask независимо от типа возвращаемого типа функции. Если тип возвращаемого значения функции async — Task или ValueTask, используется оператор return без выражения.
Возвраты по ссылке
По умолчанию оператор return возвращает значение выражения. Вы можете вернуть ссылку на переменную. Возвращаемые ссылочные значения — это значения, которые метод возвращает вызывающему объекту по ссылке. То есть вызывающий объект может изменить значение, возвращаемое методом, и это изменение отражается в состоянии объекта в вызываемом методе. Для этого используйте инструкцию return с ref ключевое слово, как показано в следующем примере:
int[] xs = [10, 20, 30, 40]; ref int found = ref FindFirst(xs, s => s == 30); found = 0; Console.WriteLine(string.Join(" ", xs)); // output: 10 20 0 40 ref int FindFirst(int[] numbers, Func predicate) < for (int i = 0; i < numbers.Length; i++) < if (predicate(numbers[i])) < return ref numbers[i]; >> throw new InvalidOperationException("No element satisfies the given condition."); >
Возвращаемое ссылочное значение позволяет методу вернуть вызывающей стороне ссылку на переменную, а не фиксированное значение. После этого вызывающий может самостоятельно решить, как обрабатывать полученную переменную: по значению или по ссылке. Вызывающий объект может создать новую переменную, которая является ссылкой на возвращаемое значение, называемое локальным ссылкой. Возвращаемое ссылочное значение означает, что метод возвращает ссылку на некоторую переменную (или ее псевдоним). В область действия переменной должен входить этот метод. Время существования переменной должно продолжаться после того, как метод возвращает управление. Все изменения, которые вызывающий производит с возвращаемым значением метода, применяются к возвращенной переменной.
Если для метода объявлено возвращаемое ссылочное значение, значит он возвращает псевдоним переменной. Цель разработки часто заключается в том, что вызов кода обращается к этой переменной с помощью псевдонима, в том числе для изменения. Методы, возвращаемые по ссылке, не могут иметь тип возвращаемого значения void .
Чтобы вызывающий объект изменял состояние объекта, возвращаемое значение ссылки должно храниться в переменной, которая явно определяется как эталонная переменная.
Возвращаемое ref значение — это псевдоним другой переменной в область вызываемого метода. Любое применение возвращаемого ссылочного значения можно рассматривать как применение псевдонима соответствующей переменной.
- При назначении его значения вы назначаете значение переменной, которую он псевдонимирует.
- При чтении его значения вы считываете значение переменной, которую он псевдонимирует.
- Если вы возвращаете его по ссылке, вы возвращаете псевдоним в ту же переменную.
- Если передать его другому методу по ссылке, вы передаете ссылку на переменную, которую он псевдонимирует.
- Создавая для псевдонима локальную ссылочную переменную, вы создаете новый псевдоним для той же переменной.
Возвращаемое значение ref должно быть ref-safe-context для вызывающего метода. Это означает:
- Время существования возвращаемого значения должно превышать период выполнения метода. Другими словами, это не может быть локальная переменная в методе, который возвращает его. Это может быть экземпляр статического поля или класса, а также переданный в метод аргумент. Попытка вернуть локальную переменную создает ошибку компилятора CS8168, «Не удается вернуть локальный obj по ссылке, так как он не является локальным.
- Возвращаемое значение не может быть литеральным null . Метод с возвратом ссылок может возвращать псевдоним переменной, значение которой в настоящее время null является значением (неинстанизированным) или типом значения NULL для типа значения.
- Возвращаемое значение не может быть константой, элементом перечисления, возвращаемым значением из свойства или методом или class struct .
Кроме того, значения возвращаемых ссылок не допускаются для асинхронных методов. Асинхронный метод может вернуть управление до того, как будет завершено его выполнение и станет известно его возвращаемое значение.
Метод, возвращающий возвращаемое значение ссылки, должен:
- Добавьте ссылку ключевое слово перед типом возвращаемого значения.
- Каждый оператор return в теле метода включает ключевое слово ref перед именем возвращаемого экземпляра.
В следующем примере показан метод, который удовлетворяет указанным условиям и возвращает ссылку на объект Person с именем p :
public ref Person GetContactInformation(string fname, string lname) < // . method implementation. return ref p; >
Ниже приведен более полный пример возвращаемого ссылочного значения, в котором показаны сигнатура и тело метода.
public static ref int Find(int[,] matrix, Func predicate)
Вызываемый метод может также объявить возвращаемое значение ref readonly , чтобы вернуть значение по ссылке, и запретить вызывающему коду изменять возвращаемое значение. Вызывающий метод может избежать копирования возвращаемого значения, сохраняя значение в локальной ref readonly эталонной переменной.
В следующем примере определяется класс Book , содержащий два поля String: Title и Author . Также определяется класс BookCollection , который включает частный массив объектов Book . Отдельные объекты книг возвращаются по ссылке путем вызова метода GetBookByTitle .
public class Book < public string Author; public string Title; >public class BookCollection < private Book[] books = < new Book < Title = "Call of the Wild, The", Author = "Jack London" >, new Book < Title = "Tale of Two Cities, A", Author = "Charles Dickens" >>; private Book nobook = null; public ref Book GetBookByTitle(string title) < for (int ctr = 0; ctr < books.Length; ctr++) < if (title == books[ctr].Title) return ref books[ctr]; >return ref nobook; > public void ListBooks() < foreach (var book in books) < Console.WriteLine($", by "); > Console.WriteLine(); > >
Если вызывающий объект сохраняет значение, возвращаемое методом GetBookByTitle , в качестве ссылочной локальной переменной, изменения, которые этот объект вносит в возвращаемое значение, отражаются в объекте BookCollection , как показано в следующем примере.
var bc = new BookCollection(); bc.ListBooks(); ref var book = ref bc.GetBookByTitle("Call of the Wild, The"); if (book != null) book = new Book < Title = "Republic, The", Author = "Plato" >; bc.ListBooks(); // The example displays the following output: // Call of the Wild, The, by Jack London // Tale of Two Cities, A, by Charles Dickens // // Republic, The, by Plato // Tale of Two Cities, A, by Charles Dickens
Инструкция goto
Оператор goto передает управление оператору, помеченному меткой, как показано в следующем примере:
var matrices = new Dictionary < ["A"] = [ [1, 2, 3, 4], [4, 3, 2, 1] ], ["B"] = [ [5, 6, 7, 8], [8, 7, 6, 5] ], >; CheckMatrices(matrices, 4); void CheckMatrices(Dictionary matrixLookup, int target) < foreach (var (key, matrix) in matrixLookup) < for (int row = 0; row < matrix.Length; row++) < for (int col = 0; col < matrix[row].Length; col++) < if (matrix[row][col] == target) < goto Found; >> > Console.WriteLine($"Not found in matrix ."); continue; Found: Console.WriteLine($"Found in matrix ."); > > // Output: // Found 4 in matrix A. // Not found 4 in matrix B.
Как показано в предыдущем примере, для выхода из вложенного цикла можно использовать оператор goto .
При работе с вложенными циклами рассмотрите возможность рефакторинга отдельных циклов в отдельные методы. В результате вы можете получить упрощенный, более удобочитаемый код без оператора goto .
В операторе switch можно также использовать оператор goto для передачи управления в раздел switch с меткой константы case, как показано в следующем примере:
using System; public enum CoffeeChoice < Plain, WithMilk, WithIceCream, >public class GotoInSwitchExample < public static void Main() < Console.WriteLine(CalculatePrice(CoffeeChoice.Plain)); // output: 10.0 Console.WriteLine(CalculatePrice(CoffeeChoice.WithMilk)); // output: 15.0 Console.WriteLine(CalculatePrice(CoffeeChoice.WithIceCream)); // output: 17.0 >private static decimal CalculatePrice(CoffeeChoice choice) < decimal price = 0; switch (choice) < case CoffeeChoice.Plain: price += 10.0m; break; case CoffeeChoice.WithMilk: price += 5.0m; goto case CoffeeChoice.Plain; case CoffeeChoice.WithIceCream: price += 7.0m; goto case CoffeeChoice.Plain; >return price; > >
В операторе switch можно также использовать оператор goto default; для передачи управления в раздел switch с меткой default .
Если метка с заданным именем не существует в текущем элементе функции или если goto инструкция не находится в область метки, возникает ошибка во время компиляции. То есть инструкцию goto нельзя использовать для передачи управления из текущего элемента функции или в вложенные область.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
- Оператор break
- Оператор continue
- Оператор return
- Оператор goto
См. также
- справочник по C#
- Инструкция yield
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Оператор Exit (Visual Basic)
Завершает процедуру или блок и немедленно передает управление инструкции после вызова процедуры или определения блока.
Синтаксис
Exit
Операторы
Exit Do
Немедленно завершает цикл, Do в котором он отображается. Выполнение продолжается с инструкцией, следующей за оператором Loop . Exit Do может использоваться только внутри Do цикла. При использовании во вложенных Do циклах Exit Do выходит из самого внутреннего цикла и передает управление следующему более высокому уровню вложенности.
Exit For
Немедленно завершает цикл, For в котором он отображается. Выполнение продолжается с инструкцией, следующей за оператором Next . Exit For может использоваться только в цикле For . Next или For Each . Next . При использовании во вложенных For циклах Exit For выходит из самого внутреннего цикла и передает управление следующему более высокому уровню вложенности.
Exit Function
Немедленно завершает процедуру Function , в которой она отображается. Выполнение продолжается с инструкцией, следующей за инструкцией, которая вызвала процедуру Function . Exit Function может использоваться только внутри Function процедуры.
Чтобы указать возвращаемое значение, можно назначить значение имени функции в строке перед оператором Exit Function . Чтобы назначить возвращаемое значение и выйти из функции в одном операторе, можно использовать оператор Return.
Exit Property
Немедленно завершает процедуру Property , в которой она отображается. Выполнение продолжается с инструкцией, которая вызвала Property процедуру, то есть с инструкцией, запрашивающей или устанавливающей значение свойства. Exit Property может использоваться только в процедуре Get свойства или Set .
Чтобы указать возвращаемое значение в процедуре Get , можно назначить значение имени функции в строке перед оператором Exit Property . Чтобы назначить возвращаемое значение и выйти из Get процедуры в одном операторе Return , можно использовать оператор .
Set В процедуре Exit Property оператор эквивалентен оператору Return .
Exit Select
Немедленно выходит из Select Case блока, в котором он отображается. Выполнение продолжается с инструкцией, следующей за оператором End Select . Exit Select может использоваться только внутри Select Case оператора .
Exit Sub
Немедленно завершает процедуру Sub , в которой она отображается. Выполнение продолжается с инструкцией, следующей за инструкцией, которая вызвала процедуру Sub . Exit Sub может использоваться только внутри Sub процедуры.
Sub В процедуре Exit Sub оператор эквивалентен оператору Return .
Exit Try
Немедленно выходит из Try блока или Catch , в котором он отображается. Выполнение продолжается с блоком Finally , если он есть, или с инструкцией, следующей за оператором , в End Try противном случае. Exit Try может использоваться только внутри Try блока или Catch , а не внутри Finally блока.
Exit While
Немедленно завершает цикл, While в котором он отображается. Выполнение продолжается с инструкцией, следующей за оператором End While . Exit While может использоваться только внутри While цикла. При использовании во вложенных While циклах передает управление циклу, который является на один вложенный уровень выше цикла, Exit While где Exit While происходит.
Комментарии
Не путайте Exit операторы с End операторами . Exit не определяет конец оператора .
Пример 1
В следующем примере условие цикла останавливает цикл, если index переменная больше 100. Однако If оператор в цикле приводит к остановке Exit Do цикла, если переменная индекса больше 10.
Dim index As Integer = 0 Do While index 10 Then Exit Do End If Debug.Write(index.ToString & " ") index += 1 Loop Debug.WriteLine("") ' Output: 0 1 2 3 4 5 6 7 8 9 10
Пример 2
В следующем примере возвращаемое значение присваивается имени myFunction функции , а затем используется Exit Function для возврата из функции:
Function MyFunction(ByVal j As Integer) As Double MyFunction = 3.87 * j Exit Function End Function
Пример 3
В следующем примере оператор Return используется для назначения возвращаемого значения и выхода из функции:
Function MyFunction(ByVal j As Integer) As Double Return 3.87 * j End Function
См. также раздел
- Оператор Continue
- Оператор Do…Loop
- Оператор End
- Оператор For Each…Next
- Оператор For…Next
- Оператор Function
- Оператор return
- Оператор Stop
- Оператор Sub
- Оператор Try. Catch. Finally
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Как выйти из if
Сообщение от xcho_
мне выход из IF() нужен был.
Что это значит, выход из IF? If — это блок операторов, который выполняется при при определенном условии, указанном в (), и выполняется один раз, а не в ЦИКЛЕ. Выход может быть из цикла, в случае с if — причем тут выход?Если блок операторов выполняется не один раз, то оператор IF к этому точно отношения не имеет. IF определят только истинность суммы всех условий, указанных в (), если ДА — выполняем, если НЕТ — не выполняем, третьего не дано!
__________________
Делай всё быстро, но не торопись! . ._/*o|o*\_.
26.03.2006, 17:16
[1 11.04.2006]
Регистрация: Jan 2006
Адрес: HG,DE
Сообщений: 668
я понимаю. действительно глупо звучит как-то!
__________________
сегодня лучше чем вчера?
Часовой пояс GMT +4, время: 04:49 . |
Вы не можете создавать новые темы Вы не можете отвечать в темах Вы не можете прикреплять вложения Вы не можете редактировать свои сообщения BB коды Вкл. Смайлы Вкл. [IMG] код Вкл. HTML код Выкл. |