Шаг 196.
Язык программирования C#. Начала.
Перечисления и структуры. Свойства и индексаторы в структурах

    На этом шаге мы рассмотрим пример перечисленных конструкций в структурах.

    В структурах можно использовать индексаторы и свойства. Принцип реализации этих членов структуры такой же, как и в случае с классами. Программа, в которой есть структура с индексаторами и свойствами, представлена в примере ниже.

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

namespace pr196_1
{
    // Структура: 
    struct MyStruct {
        // Закрытое текстовое поле:
        private string txt;
        // Текстовое свойство: 
        public string text {
            // Аксессор для считывания значения свойства: 
            get {
                return txt;
            }
            // Аксессор для присваивания значения свойству: 
            set {
                txt = value;
            }
        }
        // Целочисленное свойство (доступно для чтения): 
        public int length {
            // Аксессор для считывания значения свойства: 
            get {
                return txt.Length;
            }
        }
        // Индексатор с целочисленным индексом: 
        public char this[int k] {
            // Аксессор для считывания значения: 
            get {
                return txt[k];
            }
            // Аксессор для присваивания значения: 
            set {
                // Преобразование текста в символьный массив: 
                char[] s = txt.ToCharArray();
                // Замена символа в массиве: 
                s[k] = value;
                // Преобразование массива в текст: 
                txt = new string(s);
            }
        }
    }

    // Класс с главным методом: 
    class Program
    { 
        // Главный метод:
        static void Main()
        {
            // Создание экземпляра структуры:
            MyStruct A = new MyStruct();
            // Присваивание значения текстовому свойству:
            A.text = "Alpha";
            // Проверка значения текстового свойства:
            Console.WriteLine(A.text);
            // Использование индексатора и 
            // целочисленного свойства:  
            for(int k = 0; k <A.length; k++) {
                Console.Write("|" + A[k]);
            }
            Console.WriteLine("|");
            // Использование индексатора и 
            // целочисленного свойства:
            A[0] = 'a';
            A[A.length - 1] = 'A';
            // Проверка значения текстового свойства:
            Console.WriteLine(A.text);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

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


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

    В нашем примере структура MyStruct содержит закрытое текстовое поле txt, а также имеет текстовое свойство text. При считывании значения свойства возвращается значение поля txt. При присваивании значения свойству значение присваивается полю txt.

    Еще одно свойство length является целочисленным. Оно доступно только для считывания. В качестве значения свойства возвращается размер текста в текстовом поле txt (выражение txt.Length).

    Индексатор с целочисленным индексом (обозначен как k) определен так, что результатом возвращается символ из поля txt с соответствующим индексом (выражение txt[k]). При присваивании символьного значения проиндексированному экземпляру структуры в текстовом поле txt меняется значение символа с данным индексом. Поскольку текстовые значения неизменны, то технически все реализуется следующим образом (код set-аксессора для индексатора). Сначала командой

  char[] s = txt.ToCharArray();
на основе текста из текстового поля txt создается символьный массив s. Затем командой
  s[k] = value;
в этом символьном массиве меняется значение элемента с индексом k (индекс в квадратных скобках после имени экземпляра структуры). После этого командой
  txt = new string (s); 
на основе символьного массива создается текстовый объект, и ссылка на него записывается в поле txt.

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

  MyStruct A = new MyStruct(); 
создаем экземпляр структуры. С помощью команды
  A.text = "Alpha"; 
текстовому свойству этого экземпляра присваивается значение. Проверку значения текстового свойства выполняем командой
  Console.WriteLine(A.text);      .


Если попытаться вместо команды
  MyStruct A = new MyStruct(); 
использовать команду
  MyStruct A;    , 
то программа не скомпилируется. Дело в том, что при создании экземпляра структуры командой
  MyStruct A; 
закрытое поле txt не инициализируется, и поэтому попытка обращения к свойству text будет заблокирована. Если для создания экземпляра структуры используется команда
  MyStruct A = new MyStruct();     , 
то закрытое поле txt получает значение по умолчанию null, и мы можем использовать свойство text (чтобы присвоить значение).

    Для сравнения мы отображаем значение текстового поля посимвольно. Для этого используем конструкцию цикла, в которой каждый символ считывается индексированием экземпляра структуры (инструкция вида A[k]), а размер текста определяется с помощью целочисленного свойства (инструкция A.length).

    Командами

  A[0] = 'a'; 
и
  A[A.length - 1] = 'A'; 
меняются значения начального и последнего символов в текстовом поле, после чего результат проверяется с помощью команды
  Console.WriteLine(A.text);     .

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




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