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

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

    Хотя структура сама по себе относится к типу данных с прямым доступом к значению, среди полей структуры могут быть значения ссылочных типов. Одна из таких ситуаций - когда поле структуры является массивом (ссылкой на массив). Соответствующая программа представлена в примере ниже.

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

namespace pr193_1
{
    // Структура: 
    struct MyStruct {
        // Ссылка на символьный массив: 
        public char[] symbs;
        // Метод для отображения содержимого массива: 
        public void show() {
            for(int k = 0; k < symbs.Length; k++) { 
                Console.Write("|" + symbs[k]);
            }
            Console.WriteLine("|");
        }
    }

    // Класс с главным методом: 
    class Program
    {
        // Главный метод:
        static void Main()
        {
            // Создание экземпляров структуры:
            MyStruct A, B;
            // Полю присваивается ссылка на массив 
            A.symbs = new char[7];
            // Заполнение массива: 
            for(int k = 0; k < A.symbs.Length; k++) { 
                A.symbs[k] = (char)('A' + k);
            }
            Console.WriteLine("Экземпляр A:");
            // Содержимое массива:
            A.show();
            // Присваивание экземпляров структуры:
            B = A;
            Console.WriteLine("Экземпляр B:");
            // Содержимое массива:
            B.show();
            // Присваивание значений элементам массива:
            A.symbs[0] = 'X';
            B.symbs[B.symbs.Length - 1] = 'Y'; 
            Console.WriteLine("Экземпляр A:");
            // Содержимое массива:
            A.show();
            Console.WriteLine("Экземпляр B:");
            // Содержимое массива:
            B.show();
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Ниже показан результат выполнения программы:


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

    В программе мы описали структуру MyStruct, у которой есть открытое поле symbs, являющееся ссылкой на символьный массив. Также в структуре описан метод show(), который при вызове отображает в консольном окне содержимое массива, на который ссылается поле symbs экземпляра структуры.

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

  MyStruct A, B;
создаются два экземпляра структуры. Затем командой
  A.symbs = new char[7]; 
создается массив, и ссылка на этот массив записывается в поле symbs экземпляра A. С помощью конструкции цикла созданный массив последовательно заполняется символами, начиная с символа 'A'. Содержимое массива проверяем с помощью команды
  A.show();     . 
Затем выполняется присваивание (команда
  B = A;
). В результате полю symbs экземпляра B присваивается значение поля symbs экземпляра A. Но значение поля symbs экземпляра A - это ссылка на созданный ранее массив. Получается, что поле symbs экземпляра B будет ссылаться на точно тот же массив. При выполнении команды
  B.show(); 
действительно получаем уже знакомую нам последовательность символов. Но чтобы убедиться, что поля в экземплярах A и B ссылаются на один и тот же массив, а не на два одинаковых массива, используем команды
  A.symbs[0] = 'X';
и
  B.symbs[B.symbs.Length - 1] = 'Y';      . 
Первой командой меняется значение начального элемента в массиве, на который ссылается поле из экземпляра A, а второй командой меняется значение последнего элемента в массиве, на который ссылается поле из экземпляра B. После выполнения команд
  A.show(); 
и
  B.show(); 
убеждаемся, что экземпляры действительно ссылаются на один и тот же массив.

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




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