Руководство C# Structure

1- Что такое Struct?

В C# Struct (структура) является особым видом значения, она создает переменную для хранения нескольких отдельных значений, но эти значения связаны друг с другом.
Например, информация о сотруднике включает:
  • Код сотрудника
  • Имя сотрудника
  • Позиция
Вы можете создать 3 переменных для хранения информации сотрудника выше. Однако вы можете создать Struct для хранения всех трех данных в одной переменной.
С# использует ключевое слово struct для объявления struct.
Employee.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpStructureTutorial
{
    struct Employee
    {

        public string empNumber;
        public string empName;
        public string position;

        public Employee(string empNumber, string empName, string position)
        {
            this.empNumber = empNumber;
            this.empName = empName;
            this.position = position;
        }
    }

}
Пример использования Struct:
EmployeeTest.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpStructureTutorial
{
    class EmployeeTest
    {

        public static void Main(string[] args)
        {
            Employee john = new Employee("E01","John", "CLERK");

            Console.WriteLine("Emp Number: " + john.empNumber);
            Console.WriteLine("Emp Name: " + john.empName);
            Console.WriteLine("Emp Position: " + john.position);

            Console.Read();
        }
    }

}
Запуск примера:

2- Struct по сравнению с Class

Struct обычно используется для создания объекта для хранения значений, тогда как класс используется более разнообразно.
  1. Struct не позволяет наследовать, он не может расширяться из определенного класса или struct.
  2. Struct не позволяет реализовать Interface.
Одна из struct, часто используемых в C#, является DateTime, структура, описывающая дату и время. Вы можете больше узнать об использовании даты и времени в C# ​​​​​​​по ссылке:
Если struct появляется как параметр в методе, он передается как значение. Между тем, если класс появляется как параметр в методе, он передается как ссылка (reference).
MyClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpStructureTutorial
{
    class MyClass
    {

       public string name = "Abc";

       public MyClass(string name)
       {
           this.name = name;
       }
    }

}
MyStruct.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpStructureTutorial
{
    struct MyStruct
    {
       public string name;

       public MyStruct(string name)
       {
           this.name = name;
       }
    }

}
MyTest.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpStructureTutorial
{
    class MyTest
    {
        private static void passToMe(MyClass myClass, MyStruct myStruct)
        {
            // Поменять значение поля name.
            myClass.name = "New Name";
 
            // Поменять значение поля name.
            myStruct.name = "New Name";
        }

        public static void Main(string[] args)  
        {
            MyClass myClass = new MyClass("Abc");
            MyStruct myStruct = new MyStruct("Abc");

            Console.WriteLine("Before pass to method");
            Console.WriteLine("myClass.name = " + myClass.name);// Abc
            Console.WriteLine("myStruct.name = " + myStruct.name);// Abc

            Console.WriteLine("Pass to method");

            // 'myStruct' передает методу копию.
            // (Не оригинальный объект).
            passToMe(myClass, myStruct);

 
            Console.WriteLine("myClass.name = " + myClass.name); // New Name
            Console.WriteLine("myStruct.name = " + myStruct.name);// Abc

            Console.Read();

        }
         
    }

}
Запуск примера:

3- Constructor в Struct

Struct может иметь конструкторы (constructors), но не имеет деструктора (destructor).
Здесь приведены несколько замечаний для Constructor:
  1. Вы не можете написать конструктор по умолчанию (без параметров) для struct.
  2. В конструкторе вы должны присвоить значения всем полям struct.

4- Методы и свойства в Struct

Struct может иметь методы и свойства (Property), а так как Struct не наследует, следовательно, все его методы и свойства не могут быть абстрактными (abstract).
Book.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpStructureTutorial
{
    struct Book
    {

        private string title;
        private string author;

        // Property
        public string Title
        {
            get
            {
                return this.title;
            }
            set
            {
                this.title = value;
            }
        }

        // Property
        public string Author
        {
            get
            {
                return this.author;
            }
        }

        // Constructor.
        public Book(string title, string author)
        {
            this.title = title;
            this.author = author;
        }

        // Method.
        public string GetInfo()
        {
            return "Book Title: " + this.title + ", Author: " + this.author;
        }
 
    }

}

5- Indexer и Event в Struct

Struct может содержать Indexer и Event, подробнее о Indexer и Event можно узнать по ссылке: