На этом шаге мы рассмотрим пример перечисленных конструкций в структурах.
В структурах можно использовать индексаторы и свойства. Принцип реализации этих членов структуры такой же, как и в случае с классами. Программа, в которой есть структура с индексаторами и свойствами, представлена в примере ниже.
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();
s[k] = value;
txt = new string (s);
В главном методе программы командой
MyStruct A = new MyStruct();
A.text = "Alpha";
Console.WriteLine(A.text); .
MyStruct A = new MyStruct();
MyStruct A; ,
MyStruct A;
MyStruct A = new MyStruct(); ,
Для сравнения мы отображаем значение текстового поля посимвольно. Для этого используем конструкцию цикла, в которой каждый символ считывается индексированием экземпляра структуры (инструкция вида A[k]), а размер текста определяется с помощью целочисленного свойства (инструкция A.length).
Командами
A[0] = 'a';
A[A.length - 1] = 'A';
Console.WriteLine(A.text); .
На следующем шаге мы рассмотрим экземпляр структуры как аргумент метода.