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

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

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

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

namespace pr192_1
{ 
    // Структура: 
    struct MyStruct {
        // Целочисленное поле: 
        public int code;
        // Текстовое поле: 
        public string name;
        // Конструктор:
        public MyStruct(int n, string t) {
            code = n; // Значение целочисленного поля
            name = t; // Значение текстового поля
        }
        // Метод:
        public void show() {
            // Отображение значений полей:
            Console.WriteLine("Поля \"{0}\" и {1}", name, code);
        }
    }

    // Класс с главным методом:

    class Program
    {
        // Главный метод:
        static void Main()
        {
            // Создание экземпляра структуры:
            MyStruct A;
            // Присваивание значений полям:
            A.code = 100;
            A.name = "Экземпляр A";
            // Вызов метода:
            A.show();
            // Создание экземпляра структуры:
            MyStruct B = new MyStruct(200, "Экземпляр B");
            // Вызов метода:
            B.show();
            // Присваивание экземпляров:
            A = B;
            // Присваивание значения полю:
            B.code = 300;
            // Вызов методов:
            A.show();
            B.show();
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

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


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

    Мы описываем структуру MyStruct следующим образом:

    struct MyStruct {
        // Целочисленное поле: 
        public int code;
        // Текстовое поле: 
        public string name;
        // Конструктор:
        public MyStruct(int n, string t) {
            code = n; // Значение целочисленного поля
            name = t; // Значение текстового поля
        }
        // Метод:
        public void show() {
            // Отображение значений полей:
            Console.WriteLine("Поля \"{0}\" и {1}", name, code);
        }
    }

    У этой структуры есть два открытых поля: целочисленное (тип int) поле code и текстовое (тип string) поле name. Мы также описали конструктор структуры с двумя аргументами (целое число и текст), которые определяют значения полей создаваемого экземпляра. Таким образом, при создании экземпляров структуры мы можем использовать либо конструктор по умолчанию (без аргументов), либо конструктор с двумя аргументами. Еще в структуре описан метод show(). Он не имеет аргументов и не возвращает результат. При вызове метод отображает в консольном окне значения полей экземпляра, из которого он был вызван.

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

            MyStruct A;
создается экземпляр A структуры MyStruct. В данном случае при создании экземпляра его поля не инициализируются. Поэтому нам нужно присвоить значения полям экземпляра.


При создании экземпляра структуры вместо команды
MyStruct A; 
мы могли использовать команду
MyStruct A = new MyStruct();     . 
В этом случае поле code получило бы значение по умолчанию 0, а поле name содержало бы пустую ссылку null.

    Присваивание значений полям осуществляется командами

  A.code = 100; 
и
  A.name = "Экземпляр A";         . 

    После этого командой

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

    Еще один экземпляр структуры создается командой

  MyStruct B = new MyStruct(200, "Экземпляр B");             . 

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

  B.show();              .

    В программе есть пример операции присваивания: командой

  A = B; 
экземпляр B присваивается в качестве значения экземпляру A. Если бы мы имели дело с объектами класса, то копирование выполнялось бы на уровне ссылок на объекты, и в результате обе переменные ссылались бы на один и тот же объект. В данном случае значениями переменных A и B являются не ссылки, а сами экземпляры. Команда присваивания выполняется как побитовое копирование значений полей из экземпляра B в экземпляр A. В результате поле name экземпляра A получает значение "Экземпляр B", а поле code экземпляра A получает значение 200. При этом оба экземпляра остаются физически разными. Поэтому при выполнении команды
  B.code = 300; 
поле code экземпляра B получает значение 300, а поле code экземпляра A остается со значением 200. В том, что это действительно так, мы убеждаемся с помощью команд
  A.show(); 
и
  B.show();       .

    Далее мы рассмотрим некоторые особенности использования структур на практике.

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




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