Шаг 198.
Язык программирования C#. Начала.
Перечисления и структуры. Экземпляр структуры как результат метода

    На этом шаге мы рассмотрим пример на такое использование структуры.

    Экземпляр структуры может возвращаться результатом метода. Небольшая программа, в которой есть метод, возвращающий результатом экземпляр структуры, представлена в примере ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr198_1
{
    // Структура: 
    struct MyStruct {
        // Ссылка на символьный массив: 
        public char[] name;
        // Целочисленное поле: 
        public int code;
        // Конструктор:
        public MyStruct(char[] s, int n) {
            // Значения полей:
            name = s;
            code = n;
        }
        // Метод для отображения значений полей: 
        public void show() {
            Console.Write("Массив: "); 
            for(int k = 0; k < name.Length; k++) {
                Console.Write("|" + name[k]);
            }
            Console.WriteLine("|\nЧисловое поле: {0}", code);
        }
    }

    // Класс с главным методом: 
    class Program
    {
        // Метод возвращает результатом экземпляр структуры: 
        static MyStruct create(string t, int n) {
            // Создание символьного массива на основе текста: 
            char[] s = t.ToCharArray();
            // Создание экземпляра структуры:
            MyStruct R = new MyStruct(s, n);
            // Результат метода: 
            return R;
        }
        // Главный метод:
        static void Main()
        {
            // Экземпляр структуры:
            MyStruct A;
            // Присваивание значения экземпляру:
            A = create("Alpha", 100);
            // Проверка значений полей:
            A.show();
            // Вызов метода из результата вызова метода: 
            create("Bravo", 200).show();
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы будет следующим:


Рис.1. Результат выполнения программы

    Структура MyStruct имеет поле name, являющееся ссылкой на символьный массив, а также в структуре есть целочисленное поле code.

    Конструктор в структуре описан так, что новый экземпляр может создаваться на основе ссылки на символьный массив и целочисленного значения. Они передаются аргументами конструктору и определяют значения полей экземпляра. Также в структуре описан метод show(), который при вызове отображает в консольном окне содержимое символьного массива и значение числового поля.

    В классе с главным методом описан еще и статический метод create(), который возвращает результатом экземпляр структуры MyStruct, а аргументами методу передаются текстовое и целочисленное значения. В теле метода командой

  char[] s = t.ToCharArray();
на основе текстового аргумента t создается символьный массив s, и затем этот символьный массив передается аргументом конструктору в команде
  MyStruct R = new MyStruct(s, n);     , 
которой создается экземпляр R структуры MyStruct. Командой
  return R; 
экземпляр структуры возвращается результатом метода.

    В главном методе командой

  MyStruct A; 
создаем экземпляр структуры, а затем командой
  A = create("Alpha", 100);
этому экземпляру в качестве значения присваивается результат вызова метода create(). Что происходит в этом случае? При вызове метода create(), в соответствии с переданными методу аргументами, создается экземпляр структуры. Этот экземпляр присваивается в качестве значения переменной A. Происходит побитовое копирование значений полей. После этого у экземпляра A поля будут иметь такие же значения, как у экземпляра, вычисленного при вызове метода create(). Проверяем это с помощью команды
  A.show();   .


В структуре MyStruct есть поле, представляющее собой ссылку на массив. Когда при вызове метода create() создается экземпляр структуры, то создается и массив, на который ссылается поле name этого экземпляра. Экземпляр возвращается в качестве результата метода. Обычно результат метода присваивается какой-то переменной. В таком случае происходит побитовое копирование значений полей. Для поля, являющегося ссылкой на массив, копируется ссылка. Получается, что и экземпляр, являющийся результатом метода, и экземпляр, которому присваивается результат вызова метода, ссылаются на один и тот же массив. Но поскольку в теле метода создается локальный экземпляр, то по завершении работы метода он будет из памяти удален. А массив останется, поскольку на массив есть ссылка в программе.

    Команду с вызовом метода create() можно интерпретировать как экземпляр делегата со всеми вытекающими отсюда последствиями. Например, мы можем вызвать метод show() из подобного выражения, как это сделано в команде

  create("Bravo", 200).show();                   .

    На следующем шаге мы рассмотрим операторные методы в структурах.




Предыдущий шаг Содержание Следующий шаг