
- •1.Встроенные типы
- •2. Опишіть відмінності значимих і посилальних типів.
- •3. Ключові слова const та readonly.
- •4. У чому полягає процес упакування й розпакування?
- •Що відбувається при використанні у виразах операндів різних типів? Наведіть приклади.
- •Що таке виняткові ситуації. Опишіть принципи їх обробки.
- •InnerException:
- •Var.CatchInner();
- •7. Передача параметрів у методи за посиланням та за значенням.
- •8. Який клас використовується для консольного вводу / виводу? Наведіть приклади вводу / виводу змінних різних типів
- •Потоки консольного ввода-вывода
- •Функциональные возможности
- •9. Що входить у сигнатуру методу.
- •10. Ключове слово this.
- •13. Ключове слово base.
- •14. Чи можна описати різні специфікатори доступу до частин get і set властивостей?
- •15. Масиви: одномірні, прямокутні й східчасті. Клас System.Array.
- •Оператор foreach.
- •18 Перегрузка методов
- •Int resl;
- •Глава 8. Подробнее о методах и классах 229
- •20.Індексатори.
- •21. Class Object.
- •Оператори is та as .
- •23. Checked и Unchecked
- •24.Інтерфейси iComparable та iComparer.
- •25. Перевантаження операторів.
- •26. Фіналізація об’єктів. Інтерфейс iDisposable
- •Колекція Arraylist
- •29. Делегаты (c 457-464 (Shildt))
- •Глава 15. Делегаты, события и лямбда-выражения 463
- •31. Сериализация
- •32. Потоки
- •Терміни managed/ummanaged, safe/unsafe, assembly, clr, cts,cls, маніфест, метадані, cil код, Framework.
Що таке виняткові ситуації. Опишіть принципи їх обробки.
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 указывает на ссылку, то сама ссылка передается по ссылке. Это позволяет изменить в методе объект, на который указывает ссылка.
____________________________________________________________________________________________________________