Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_1-33.docx
Скачиваний:
1
Добавлен:
18.09.2019
Размер:
509.29 Кб
Скачать
  1. Що таке виняткові ситуації. Опишіть принципи їх обробки.

StackTrace :

public static string StackTrace { get; }

Свойство StackTrace перечисляет вызовы метода в обратном хронологическом порядке (самый последний вызов метода описывается первым).

using System;

class Sample

{

public static void Main()

{

Console.WriteLine();

Console.WriteLine("StackTrace: '{0}'", Environment.StackTrace);

}

}

InnerException:

public Exception InnerException { get; }

Свойство InnerException используется, чтобы получить набор исключений, ставших причиной текущего исключения.

Раскрутка стека происходит в момент обработки исключения. В этот момент разрушаются все локальные объекты в обратном порядке, чем вызывались в автоматическом режиме

.

public void CatchInner()

{

try

{

this.ThrowInner();

}

catch (Exception e)

{

throw new MyAppException("Error caused by trying ThrowInner.",e);

}

}

try

{

Var.CatchInner();

}

catch(Exception e)

{

Console.WriteLine ("In Main catch block. Caught: {0}", e.Message);

Console.WriteLine ("Innearr Exception is {0}",e.InnerException);

}

}

____________________________________________________________________________________________________________

7. Передача параметрів у методи за посиланням та за значенням.

Как пояснялось выше, аргументы простых типов, например int или char, передаются методу по значению. Это означает, что изменения, вносимые в параметр, принимающий значение, не будут оказывать никакого влияния на аргумент, спользуемый для вызова. Но такое поведение можно изменить, используя ключевые слова ref и out для передачи значений обычных типов по ссылке. Это позволяет изменить в самом методе аргумент, указываемый при его вызове. Прежде чем переходить к особенностям использования ключевых слов ref и out, полезно уяснить причины, по которым значение простого типа иногда требуется передавать по ссылке. В общем, для этого существуют две причины: разрешить методу изменить содержимое его аргументов или же возвратить несколько значений. Рассмотрим каждую из этих причин более подробно.

Модификатор параметра ref принудительно организует вызов по ссылке, а не по значению. Этот модификатор указывается как при объявлении, так и при вызове метода. Для начала рассмотрим простой пример. В приведенной ниже программе создается метод Sqr (), возвращающий вместо своего аргумента квадрат его целочисленного значения. Обратите особое внимание на применение и местоположение модификатора ref.

// Использовать модификатор ref для передачи значения

// обычного типа по ссылке.

using System;

class RefTest {

// Этот метод изменяет свой аргумент. Обратите

// внимание на применение модификатора ref.

public void Sqr (ref int i) {

i = i * i;

}

}

class RefDemo {

static void Main() {

RefTest ob = new RefTest ();

int a = 10;

Console.WriteLine("а до вызова: " + a);

ob.Sqr(ref a); // обратите внимание на применение

// модификатора ref

Console.WriteLine("а после вызова: " + а);

}

}

Как видите, модификатор ref указывается перед объявлением параметра в самом методе и перед аргументом при вызове метода. Ниже приведен результат выполнения данной программы, который подтверждает, что значение аргумента а действительно было изменено методом Sqr ().

а до вызова: 10

а после вызова: 100

Теперь, используя модификатор ref, можно написать метод, переставляющий местами значения двух своих аргументов простого типа. В качестве примера ниже приведена программа, содержащая метод Swap (), производящий перестановку значений двух своих целочисленных аргументов, когда он вызывается.

// Поменять местами два значения.

using System;

class ValueSwap {

// Этот метод меняет местами свои аргументы,

public void Swap (ref int a, ref int b) {

int t;

t = a;

a = b;

b = t;

}

}

class ValueSwapDemo {

static void Main() {

ValueSwap ob = new ValueSwap();

int x = 10, у = 20;

Console.WriteLine("x и у до вызова: " +

х + " " + у) ;

ob.Swap (ref x, ref y) ;

Console.WriteLine("x и у после вызова: " +

х + " " + у) ;

}

}

Вот к какому результату приводит выполнение этой программы:

х и у до вызова: 10 20

• х и у после вызова: 20 10

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

Использование модификатора параметра out

Иногда ссылочный параметр требуется использовать для получения значения из метода,

а не для передачи ему значения. Модификатор параметра out подобен модификатору ref, за одним исключением: он служит только для передачи значения за пределы метода. Поэтому переменной,

используемой в качестве параметра out, не нужно (да и бесполезно) присваивать какое-то

значение. Более того, в методе параметр out считается неинициализированным, т.е.

предполагается, что у него отсутствует первоначальное значение. Это означает, что значение

должно быть присвоено данному параметру в методе до его завершения. Следовательно, х

после вызова метода параметр out будет содержать некоторое значение.

Ниже приведен пример применения модификатора параметра out. В этом примере

программы для разделения числа с плавающей точкой на целую и дробную части

используется метод GetParts () из класса Decompose. Обратите внимание на то, как

возвращается каждая часть исходного числа.

// Использовать модификатор параметра out.

using System;

class Decompose {

/* Разделить числовое значение с плавающей точкой на

целую и дробную части. */

public int GetParts(double n, out double frac) {

int whole;

whole = (int) n;

frac = n - whole; // передать дробную часть числа

// посредством параметра frac

return whole; // возвратить целую часть числа

}

}

class UseOut {

static void Main() {

Decompose ob = new Decompose ();

int i;

double f;

i = ob.GetPartsA0.125, out f);

Console.WriteLine("Целая часть числа равна " + i) ;

Console.WriteLine("Дробная часть числа равна " + f) ;

}

}

Выполнение этой программы дает следующий результат:

Целая часть числа равна 10

Дробная часть числа равна 0.125

Метод Get Parts () возвращает два фрагмента информации. Во-первых, целую часть исходного числового значения переменной п обычным образом с помощью оператора return. И во-вторых, дробную часть этого значения посредством параметра f гас типа out. Как показывает данный пример, используя модификатор параметра out, можно

организовать возврат двух значений из одного и того же метода. Разумеется, никаких ограничений на применение параметров out в одном методе не существует. С их помощью из метода можно возвратить сколько угодно фрагментов

информации. Применение модификаторов ref и out не ограничивается только передачей значений обычных типов. С их помощью можно также передавать ссылки на объекты. Если модификатор ref или out указывает на ссылку, то сама ссылка передается по ссылке. Это позволяет изменить в методе объект, на который указывает ссылка.

____________________________________________________________________________________________________________

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]