Kniga-Online.club
» » » » Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство

Читать бесплатно Герберт Шилдт - C# 4.0: полное руководство. Жанр: Программирование издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

    Stack stk2 = new Stack(10);

    Stack stk3 = new Stack(10);

    char ch;

    int i;

    // Поместить ряд символов в стек stk1.

    Console.WriteLine("Поместить символы А-J в стек stk1.");

    for(i=0; !stk1.IsFull(); i++)

      stk1.Push((char)('A' + i));

    if(stk1.IsFull())

      Console.WriteLine("Стек stk1 заполнен.");

    // Вывести содержимое стека stk1.

    Console.Write("Содержимое стека stk1: ");

    while( !stk1.IsEmpty()) {

      ch = stk1.Pop();

      Console.Write(ch);

    }

    Console.WriteLine();

    if(stk1.IsEmpty())

      Console.WriteLine("Стек stk1 пуст.");

    // Поместить дополнительные символы в стек stk1.

    Console.WriteLine("Вновь поместить символы А-J в стек stk1.");

    for(i=0; !stk1.IsFull(); i++)

      stk1.Push((char)('A' + i));

    // А теперь извлечь элементы из стека stk1 и поместить их в стек stk2.

    // В итоге элементы сохраняются в стеке stk2 в обратном порядке.

    Console.WriteLine("А теперь извлечь символы из стека stk1n" +

          "и поместить их в стек stk2.");

    while( !stk1.IsEmpty()) {

      ch = stk1.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' + i)) ;

    Console.WriteLine("Емкость стека stk3: " + stk3.Capacity());

    Console.WriteLine("Количество объектов в стеке stk3: " 

          + stk3.GetNum());

  }

}

При выполнении этой программы получается следующий результат.

Поместить символы А-J в стек stk1.

Стек stk1 заполнен.

Содержимое стека stk1: JIHGFEDCBA

Стек stk1 пуст.

Вновь поместить символы А-J в стек stk1.

А теперь извлечь символы из стека stk1

и поместить их в стек 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 ob1 = new MyClass(4, 5);

    MyClass ob2 = new MyClass(6, 7);

    Console.Write("ob1: ");

    ob1.Show();

    Console.Write("ob2: ");

    ob2.Show();

    if(ob1.SameAs(ob2))

      Console.WriteLine("ob1 и ob2 имеют одинаковые значения.");

    else

      Console.WriteLine("ob1 и ob2 имеют разные значения.");

    Console.WriteLine() ;

    // А теперь сделать объект ob1 копией объекта ob2.

    ob1.Copy(ob2);

    Console.Write("ob1 после копирования: ");

    ob1.Show();

    if(ob1.SameAs(ob2) )

      Console.WriteLine("ob1 и ob2 имеют одинаковые значения.");

    else

      Console.WriteLine("ob1 и ob2 имеют разные значения.");

  }

}

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

ob1: alpha: 4, beta: 5

ob2: alpha: 6, beta: 7

оb1 и ob2 имеют разные значения.

оb1 после копирования: alpha: 6, beta: 7

ob1 и оb2 имеют одинаковые значения.

Каждый из методов SameAs() и Сору() в приведенной выше программе получает ссылку на объект типа MyClass в качестве аргумента. Метод SameAs() сравнивает значения переменных экземпляра alpha и beta в вызывающем объекте со значениями аналогичных переменных в объекте, передаваемом посредством параметра ob. Данный метод возвращает логическое значение true только в том случае, если оба объекта имеют одинаковые значения этих переменных экземпляра. А метод Сору() присваивает значения переменных alpha и beta из объекта, передаваемого по ссылке посредством параметра ob, переменным alpha и beta из вызывающего объекта. Как показывает данный пример, с точки зрения синтаксиса объекты передаются методам по ссылке таким же образом, как и значения обычных типов.

Способы передачи аргументов методу

Как показывает приведенный выше пример, передача объекта методу по ссылке делается достаточно просто. Но в этом примере показаны не все нюансы данного процесса. В некоторых случаях последствия передачи объекта по ссылке будут отличаться от тех результатов, к которым приводит передача значения обычного типа. Для выяснения причин этих отличий рассмотрим два способа передачи аргументов методу.

Первым способом является вызов по значению. В этом случае значение аргумента копируется в формальный параметр метода. Следовательно, изменения, вносимые в параметр метода, не оказывают никакого влияния на аргумент, используемый для вызова. А вторым способом передачи аргумента является вызов по ссылке. В данном случае параметру метода передается ссылка на аргумент, а не значение аргумента. В методе эта ссылка используется для доступа к конкретному аргументу, указываемому при вызове. Это означает, что изменения, вносимые в параметр, будут оказывать влияние на аргумент, используемый для вызова метода.

По умолчанию в C# используется вызов по значению, а это означает, что копия аргумента создается и затем передается принимающему параметру. Следовательно, при передаче значения обычного типа, например int или double, все, что происходит с параметром, принимающим аргумент, не оказывает никакого влияния за пределами метода. В качестве примера рассмотрим следующую программу.

// Передача аргументов обычных типов по значению,

using System;

class Test {

  /* Этот метод не оказывает никакого влияния на аргументы, используемые для его вызова. */

  public void NoChange(int i, int j) {

Перейти на страницу:

Герберт Шилдт читать все книги автора по порядку

Герберт Шилдт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


C# 4.0: полное руководство отзывы

Отзывы читателей о книге C# 4.0: полное руководство, автор: Герберт Шилдт. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*