openplanning

Hướng dẫn và ví dụ C# Structure

  1. Struct là gì?
  2. Struct so với Class
  3. Constructor của Struct
  4. Phương thức và thuộc tính của Struct
  5. Indexer và Event của Struct

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ụ:
Emp Number: E01
Emp Name: John
Emp Position: CLECK

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.
  • 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.
  • Struct không cho phép thực hiện (implements) Interface.
Một trong các struct hay được sử dụng trong C# đó là DateTime, nó 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 (refrence).
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ụ:
Before pass to method
myClass.name = Abc
myStruct.name = Abc
Pass to method
myClass.name = New Name
myStruct.name = Abc

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:
  • Bạn không thể viết một Constructor mặc định (Không có tham số) cho struct.
  • 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ó IndexerEvent, xem thêm về Indexer và Event tại: