Hướng dẫn sử dụng C# Structure
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Struct là gì?

Trong C#, Struct (cấu trúc) là một kiểu giá trị đặc biệt, nó tạo ra một biến để lưu trữ nhiều giá trị riêng lẻ, mà các các trị này có liên quan tới nhau.
Ví dụ thông tin về một nhân viên bao gồm:
  • Mã nhân viên
  • Tên nhân viên
  • Chức vụ
Bạn có thể tạo ra 3 biến để lưu trữ các thông tin trên của nhân viên. Tuy nhiên bạn có thể tạo ra một Struct để lưu trữ cả 3 thông tin trên trong một biến duy nhất.
C# sử dụng từ khóa struct để khai báo một 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;
        }
    }

}
Ví dụ sử dụng 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();
        }
    }

}
Chạy ví dụ:

2- Struct so với Class

Struct thường được sử dụng để tạo ra một đối tượng để lưu trữ các giá trị, trong khi đó class được sử dụng đa dạng hơn.
  1. Struct không cho phép thừa kế, nó không thể mở rộng từ một class hoặc một struct nào.
  2. Struct không cho phép thi hành Interface.
Một trong các struct hay được sử dụng trong C# đó là DateTime, một struct mô tả ngày tháng và thời gian. Bạn có thể xem thêm về sử dụng ngày tháng và thời gian trong C# tại:
Nếu struct xuất hiện như một tham số trong một phương thức, nó được truyền dưới dạng giá trị. Trong khi đó nếu class xuất hiện như là một tham số trong một phương thức nó được truyền như một tham chiếu.
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)
       {
         
           // Thay đổi giá trị trường name.
           myClass.name = "New Name";

    
           // Thay đổi giá trị trường 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 truyền vào phương thức là một bản copy.
           // (Không phải là đối tượng gốc).
           passToMe(myClass, myStruct);


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

           Console.Read();

       }
       
   }

}
Chạy ví dụ:

3- Constructor của Struct

Struct có thể có các Constructor (Phương thức khởi tạo), nhưng không có Destructor (Phương thức hủy đối tượng).
Dưới đây là một số chú ý đối với Constructor:
  1. Bạn không thể viết một Constructor mặc định (Không có tham số) cho struct.
  2. Trong Constructor bạn phải gán các giá trị cho tất cả các trường của struct.

4- Phương thức và thuộc tính của Struct

Struct có thể có các phương thức và thuộc tính (Property), và vì Struct không có thừa kế nên tất cả các phương thức, thuộc tính của nó không được phép trừu tượng (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 và Event của Struct

Struct có thể có Indexer và Event, xem thêm về Indexer và Event tại:
  • TODO (LINK?)