"и поместить их в стек stk2."); while( !stkl.IsEmpty() ) {
ch = stkl.Pop(); stk2.Push(ch);
Console.Write("Содержимое стека stk2: "); while( !stk2.IsEmpty() ) {
ch = stk2.Pop();
Console.Write(ch);
}
Console.WriteLine("\n");
// Поместить 5 символов в стек.
Console.WriteLine("Поместить 5 символов в стек stk3."); for(i=0; i < 5; i++)
stk3.Push((char) ('A 1+ i)) ;
Console.WriteLine("Емкость стека stk3: " + stk3.Capacity()); Console.WriteLine("Количество объектов в стеке stk3: " + stk3.GetNum());
}
}
При выполнении этой программы получается следующий результат.
Поместить символы А-J в стек stkl.
Стек stkl заполнен.
Содержимое стека stkl: JIHGFEDCBA Стек stkl пуст.
Вновь поместить символы А-J в стек stkl.
А теперь извлечь символы из стека stkl и поместить их в стек stk2.
Содержимое стека stk2: ABCDEFGHIJ
Поместить 5 символов в стек stk3.
Емкость стека stk3: 10 Количество объектов в стеке stk3: 5
Передача объектов методам по ссылке
В приведенных до сих пор примерах программ при указании параметров, передаваемых методам, использовались типы значений, например int или double. Но в методах можно также использовать параметры ссылочного типа, что не только правильно, но и весьма распространено в ООП. Подобным образом объекты могут передаваться методам по ссылке. В качестве примера рассмотрим следующую программу.
// Пример передачи объектов методам по ссылке.
using System;
class MyClass { int alpha, beta;
public MyClass(int i, int j) { alpha = i; beta = j;
// Возвратить значение true, если параметр ob // имеет те же значения, что и вызывающий объект, public bool SameAs(MyClass ob) {
if ((ob.alpha == alpha) & (ob.beta == beta)) return true; else return false;
}
// Сделать копию объекта ob. public void Copy(MyClass ob) { alpha = ob.alpha; beta = ob.beta;
}
public void Show() {
Console.WriteLine("alpha: {0}, beta: {1}", alpha, beta);
}
}
class PassOb {
static void Main() {
MyClass obi = new MyClass(4, 5);
MyClass ob2 = new MyClass (6, 7);
Console.Write("obi: "); obi.Show ();
Console.Write("ob2: "); ob2.Show();
if(obi.SameAs(ob2))
Console.WriteLine("obi и ob2 имеют одинаковые значения."); else
Console.WriteLine("obi и ob2 имеют разные значения."); Console.WriteLine() ;
// А теперь сделать объект obi копией объекта ob2. obi.Copy(ob2);
Console.Write("obi после копирования: "); obi.Show();
if(obi.SameAs(ob2) )
Console.WriteLine("obi и ob2 имеют одинаковые значения."); else
Console.WriteLine("obi и ob2 имеют разные значения.");
}
}
Выполнение этой программы дает следующий результат.
obi: alpha: 4, beta: 5 ob2: alpha: 6, beta: 7
оЫ и ob2 имеют разные значения.
оЫ после копирования: alpha: 6, beta: 7 obi и оЬ2 имеют одинаковые значения.
Каждый из методов Same As () и Сору () в приведенной выше программе получает ссылку на объект типа MyClass в качестве аргумента. Метод Same As () сравнивает значения переменных экземпляра alpha и beta в вызывающем объекте со значениями аналогичных переменных в объекте, передаваемом посредством параметра ob. Данный метод возвращает логическое значение true только в том случае, если оба объекта имеют одинаковые значения этих переменных экземпляра. А метод Сору () присваивает значения переменных alpha и beta из объекта, передаваемого по ссылке посредством параметра ob, переменным alpha и beta из вызывающего объекта. Как показывает данный пример, с точки зрения синтаксиса объекты передаются методам по ссылке таким же образом, как и значения обычных типов.
Способы передачи аргументов методу
Как показывает приведенный выше пример, передача объекта методу по ссылке делается достаточно просто. Но в этом примере показаны не все нюансы данного процесса. В некоторых случаях последствия передачи объекта по ссылке будут отличаться от тех результатов, к которым приводит передача значения обычного типа. Для выяснения причин этих отличий рассмотрим два способа передачи аргументов методу.
Первым способом является вызов по значению. В этом случае значение аргумента копируется в формальный параметр метода. Следовательно, изменения, вносимые в параметр метода, не оказывают никакого влияния на аргумент, используемый для вызова. А вторым способом передачи аргумента является вызов по ссылке. В данном случае параметру метода передается ссылка на аргумент, а не значение аргумента. В методе эта ссылка используется для доступа к конкретному аргументу, указываемому при вызове. Это означает, что изменения, вносимые в параметр, будут оказывать влияние на аргумент, используемый для вызова метода.
Читать дальше