C# Properties: Hướng dẫn chi tiết cho người mới bắt đầu

Xin chào các bạn, những ngôi sao lập trình tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của C# Properties. Đừng lo lắng nếu bạn chưa bao giờ viết một dòng mã trước đây - tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ cùng nhau giải quyết chủ đề này từng bước một. Cuối cùng của bài hướng dẫn này, bạn sẽ trở thành một chuyên gia về Property!

C# - Properties

Properties là gì?

Trước khi chúng ta bắt đầu, hãy tưởng tượng bạn có một két tiền. Bạn có thể bỏ tiền vào và rút tiền ra, nhưng bạn không thể truy cập trực tiếp vào bên trong két tiền. Các thuộc tính trong C# hoạt động tương tự - chúng cung cấp một cách để truy cập và thay đổi giá trị của các trường riêng tư trong một lớp, trong khi vẫn duy trì kiểm soát cách truy cập đó diễn ra.

Tại sao sử dụng Properties?

  1. Đóng gói (Encapsulation): Chúng giúp ẩn cách hoạt động bên trong của một lớp.
  2. Đ灵活性 (Flexibility): Bạn có thể thay đổi cách dữ liệu được lưu trữ mà không thay đổi cách nó được truy cập.
  3. Xác thực (Validation): Bạn có thể thêm các kiểm tra để đảm bảo dữ liệu hợp lệ trước khi nó được đặt.

Bây giờ, hãy cùng viết một đoạn mã!

Cú pháp cơ bản của thuộc tính

Dưới đây là dạng đơn giản nhất của một thuộc tính:

public class Person
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
}

Trong ví dụ này, Name là thuộc tính của chúng ta. Nó được liên kết với trường riêng tư name. Các phần getset được gọi là accessor.

Accessors

Các thuộc tính có hai accessor chính:

  1. get: Truy xuất giá trị của thuộc tính
  2. set: Gán một giá trị mới cho thuộc tính

Hãy phân tích thuộc tính Name của chúng ta:

public string Name
{
get { return name; } // Đây là getter
set { name = value; } // Đây là setter
}

Khi bạn truy cập thuộc tính (ví dụ: person.Name), getter sẽ được gọi. Khi bạn gán một giá trị (ví dụ: person.Name = "John"), setter sẽ được gọi.

Thuộc tính tự động triển khai (Auto-Implemented Properties)

C# có một cách viết tắt cho các thuộc tính đơn giản không cần logic đặc biệt:

public class Person
{
public string Name { get; set; }
}

Điều này tạo ra một thuộc tính Name với một trường ẩn được C# quản lý cho bạn. Đó như một phép thuật!

Thuộc tính với logic

Bây giờ, hãy thêm một chút sự hấp dẫn vào các thuộc tính của chúng ta:

public class BankAccount
{
private decimal balance;

public decimal Balance
{
get { return balance; }
set
{
if (value < 0)
{
throw new ArgumentException("Balance cannot be negative");
}
balance = value;
}
}
}

Ở đây, chúng ta đảm bảo rằng số dư không thể âm. Nếu ai đó cố gắng đặt số dư âm, chúng ta ném một ngoại lệ. Đó như có một bảo vệ cho két tiền của bạn!

Thuộc tính chỉ đọc và chỉ ghi

Đôi khi, bạn có thể muốn hạn chế truy cập vào các thuộc tính của mình:

public class SecretAgent
{
private string codeName = "007";

// Thuộc tính chỉ đọc
public string CodeName
{
get { return codeName; }
}

// Thuộc tính chỉ ghi
public string Mission
{
set { Console.WriteLine($"New mission: {value}"); }
}
}

James Bond sẽ đồng ý với mức độ bí mật này!

Thuộc tính sử dụng biểu thức (Expression-Bodied Properties)

Đối với các thuộc tính đơn giản, C# 6.0 đã giới thiệu một cú pháp ngắn gọn hơn:

public class Circle
{
public double Radius { get; set; }

// Thuộc tính chỉ đọc sử dụng biểu thức
public double Area => Math.PI * Radius * Radius;
}

Cú pháp => như thể nói "thuộc tính này được định nghĩa bởi biểu thức sau". Nó ngắn, ngọt ngào và toán học!

Thuộc tính trừu tượng

Trong các lớp trừu tượng, bạn có thể định nghĩa các thuộc tính trừu tượng mà các lớp con phải thực thi:

public abstract class Shape
{
public abstract double Area { get; }
}

public class Square : Shape
{
public double Side { get; set; }

public override double Area => Side * Side;
}

Đó như tạo ra một bản đồ cho các thuộc tính mà các lớp con phải điền vào.

Bảng phương thức liên quan đến thuộc tính

Dưới đây là bảng phương thức liên quan đến thuộc tính:

Phương thức Mô tả Ví dụ
get Truy xuất giá trị của thuộc tính get { return name; }
set Đặt giá trị của thuộc tính set { name = value; }
init Đặt giá trị của thuộc tính chỉ trong quá trình khởi tạo đối tượng public string Name { get; init; }
value Đại diện cho giá trị được gán trong setter set { if (value != null) name = value; }

Kết luận

Chúc mừng! Bạn đã chính thức bước vào thế giới của C# Properties. Nhớ rằng, các thuộc tính giống như những người hầu giỏi cho các trường riêng tư của lớp của bạn - chúng quản lý truy cập, thực thi các quy tắc và giữ cho mọi thứ ngăn nắp.

Khi bạn tiếp tục hành trình lập trình của mình, bạn sẽ thấy các thuộc tính xuất hiện ở khắp mọi nơi. Chúng là một phần quan trọng của việc viết mã sạch và dễ bảo trì trong C#. Hãy tiếp tục thực hành, và sớm bạn sẽ trở thành một chuyên gia về thuộc tính!

Chúc các bạn lập trình vui vẻ, và may mắn để các thuộc tính của bạn luôn được bảo vệ tốt! ??‍??‍?

Credits: Image by storyset