Мониторинг обменных курсов валют
18c0693f

Инструкции


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

public class A { public static void main(String[] args) { try { if(args.length > 0) System.out.println ("Some arguments are specified"); else throw new IllegalArgumentException ("No arguments specified"); } catch(RuntimeException e) { System.out.println ("Exception caught"); System.out.println ("Exception type is " + e.getClass().getName()); System.out.println ("Exception message is \"" + e.getMessage() + "\""); } finally { System.out.println ("Performing finalization"); } } }using System;

public class A { public static void Main(string[] args) { try { if(args.Length > 0) Console.WriteLine ("Some arguments are specified"); else throw new ArgumentException ("No arguments specified"); } catch(Exception e) { Console.WriteLine ("Exception caught"); Console.WriteLine ("Exception type is " + e.GetType().FullName); Console.WriteLine ("Exception message is \"" + e.Message + "\""); } finally { Console.WriteLine ("Performing finalization"); } } }


В Java, начиная с версии 1.4, появилась инструкция assert, предназначенная для выдачи отладочных сообщений.

Эта инструкция имеет один из двух видов:

assert expression ; assert expression : expression_s ;

Выражение expression должно иметь логический тип, а выражение expression_s — произвольный.

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

Если проверка утверждений включена, то вычисляется значение expression. Если оно равно true, управление переходит дальше, иначе в обоих случаях выбрасывается исключение java.lang.AssertionError.

Во втором случае еще до выброса исключения вычисляется значение выражения expression_s, оно преобразуется в строку и записывается в качестве сообщения в создаваемое исключение.


В C# имеется возможность использовать инструкцию goto. Эта инструкция передает управления на инструкцию, помеченную меткой, которая следует за goto.

Как мы уже видели, помимо обычных меток, в goto могут использоваться метки case вместе со значениями и метка default. В этих случаях инструкция goto должна находиться внутри блока switch, в котором имеются эти метки.

При выходе с помощью goto из блока try или блока catch, у которых имеется соответствующий блок finally, сначала выполняется содержимое этого блока finally.


Ключевые слова checked и unchecked в C# могут помечать блок, определяя тем самым контекст вычислений в рамках этого блока (см. раздел о целочисленных типах).


Инструкция using может быть использована в C#, чтобы выполнить действия, требующие захвата каких-либо ресурсов, без необходимости заботиться потом об их освобождении.

Эта инструкция имеет вид:

using ( expression ) statement или using ( declaration ) statement

где declaration — это декларация одной или нескольких переменных.

Первый вид этой инструкции сводится ко второму — если тип используемого выражения T, и имя v нигде не используется, то он эквивалентен

using ( T v = expression ) statement Эта конструкция, в свою очередь, эквивалентна следующей. { T v = expression; try { statement } finally { disposal } }

Здесь disposal представляет вызов метода Dispose(), который должен быть у типа T, с возможной предварительной проверкой того, что переменная v не равна null, и приведением ее к типу System.IDisposable, если T является его подтипом.


В версии 2.0 в C# введены две инструкции yield, предназначенные для более удобного построения итераторов.

Блок, содержащий инструкцию yield, называется итерационным (iterator block) и может быть телом метода, оператора или метода доступа к свойству и не должен быть блоком finally, catch или блоком try, у которого есть соответствующие catch-блоки. Этот блок порождает последовательность значений одного типа. Сам метод или оператор должен возвращать объект одного из четырех типов:

System.Collections.IEnumerable, System.Collections.IEnumerator, System.Collections.Generic.IEnumerable <T>, System.Collections.Generic.IEnumerator <T>.

В первых двух случаях порождаются объекты типа object, во вторых двух — значения типа T.

Для возвращения одного из этой последовательности значений используется инструкция yield return expression; Выражение в ней должно иметь соответствующий тип, object или T.

Для указания на то, что порождаемая итерационным блоком последовательность значений завершилась, используется инструкция yield break;

Пример реализации итератора коллекции с использованием yield приведен ниже.
using System;

public class MyArrayList<T> { T[] items = new T[10]; int size = 0;

public int Count { get { return size; } }

public T this[int i] { get { if(i < 0 || i >= size) throw new IndexOutOfRangeException(); else return items[i]; } set { if(i < 0 || i > size) throw new IndexOutOfRangeException(); else if (i == size) { T[] newItems = new T[size + 10]; Array.Copy (items, newItems, size++); } items[i] = value; } }

public IEnumerator<T> GetEnumerator () { for(int i = 0; i < size; i++) yield return items[i]; } }

public class A { public static void Main() { MyArrayList<string> l = new MyArrayList<string>();

l[0] = "First"; l[1] = "Second"; l[2] = "Third";

foreach (string s in l) Console.WriteLine(s); } }
Инструкции обоих языков, предназначенные для синхронизации работы нескольких потоков, рассматриваются в следующей лекции, в разделе, посвященном разработке многопоточных программ.





Самый выгодный курс обмена валюты