Trong C#, lớp (class) là một cấu trúc cơ bản của lập trình hướng đối tượng, cho phép bạn tạo ra các kiểu dữ liệu tùy chỉnh bằng cách kết hợp dữ liệu (thuộc tính) và các hành vi (phương thức).
Contents
Định nghĩa lớp
Để định nghĩa một lớp trong C#, bạn sử dụng từ khóa class
theo cú pháp sau:
[phạm_vi_truy_cập] class TênLop
{
// Các thành viên của lớp
}
- phạm_vi_truy_cập: Xác định mức độ truy cập của lớp (
public
,private
,protected
,internal
). - TênLop: Tên của lớp, nên đặt theo quy tắc PascalCase.
Ví dụ: Định nghĩa một lớp Rectangle
với các thuộc tính và phương thức cơ bản:
public class Rectangle
{
// Properties
public double Length { get; set; }
public double Width { get; set; }
// Method to calculate area
public double CalculateArea()
{
return Length * Width;
}
}
Tạo đối tượng từ lớp
Sau khi định nghĩa lớp, bạn có thể tạo các đối tượng (instance) từ lớp đó bằng từ khóa new
:
Rectangle rect = new Rectangle();
Bạn cũng có thể khởi tạo đối tượng với các giá trị ban đầu:
Rectangle rect = new Rectangle
{
Length = 5.0,
Width = 3.0
};
Sử dụng đối tượng
Sau khi tạo đối tượng, bạn có thể truy cập các thuộc tính và phương thức của nó:
double area = rect.CalculateArea();
Console.WriteLine($"Area of the rectangle: {area}");
Phương thức khởi tạo (Constructor)
Phương thức khởi tạo được gọi khi một đối tượng được tạo ra, dùng để khởi tạo các giá trị ban đầu cho đối tượng.
Ví dụ: Thêm phương thức khởi tạo cho lớp Rectangle
:
public class Rectangle
{
public double Length { get; set; }
public double Width { get; set; }
// Constructor
public Rectangle(double length, double width)
{
Length = length;
Width = width;
}
public double CalculateArea()
{
return Length * Width;
}
}
Khi tạo đối tượng, bạn có thể truyền các giá trị ban đầu:
Rectangle rect = new Rectangle(5.0, 3.0);
Console.WriteLine($"Area: {rect.CalculateArea()}");
Khái niệm về từ khóa this
Trong C#, từ khóa this
được sử dụng để tham chiếu đến đối tượng hiện tại của lớp trong ngữ cảnh phương thức hoặc Constructor. Nó là một cách để phân biệt các thành viên của lớp (như thuộc tính hoặc phương thức) với các tham số hoặc biến cục bộ trong phương thức hoặc Constructor.
Tính năng chính của từ khóa this
- Tham chiếu đến đối tượng hiện tại:
this
trỏ đến đối tượng của lớp đang được sử dụng.- Cho phép bạn truy cập các thuộc tính, phương thức và chỉ số của đối tượng hiện tại.
- Làm rõ sự nhầm lẫn giữa thành viên lớp và tham số:
- Trong trường hợp tham số có cùng tên với thuộc tính của lớp,
this
được sử dụng để phân biệt.
- Trong trường hợp tham số có cùng tên với thuộc tính của lớp,
- Gọi Constructor khác trong cùng lớp:
- Sử dụng
this
để tránh lặp lại mã nguồn khi có nhiều Constructor.
- Sử dụng
- Truyền đối tượng hiện tại làm tham số:
this
có thể được sử dụng để truyền đối tượng hiện tại cho một phương thức hoặc Constructor khác.
Cách sử dụng từ khóa this
1. Tham chiếu đến thuộc tính hoặc phương thức của lớp
Khi tham số có cùng tên với thuộc tính của lớp, bạn sử dụng this
để phân biệt:
public class Rectangle
{
private double length;
private double width;
public Rectangle(double length, double width)
{
// Sử dụng this để phân biệt thuộc tính và tham số
this.length = length;
this.width = width;
}
public double CalculateArea()
{
return this.length * this.width;
}
}
Giải thích:
this.length
tham chiếu đến thuộc tínhlength
của lớp.length
(không cóthis
) tham chiếu đến tham số của Constructor.
2. Gọi Constructor khác trong cùng lớp
Bạn có thể sử dụng this
để gọi một Constructor khác trong cùng lớp. Điều này giúp tránh việc lặp lại mã nguồn khi cần thiết lập giá trị mặc định hoặc xử lý tương tự.
public class Rectangle
{
public double Length { get; set; }
public double Width { get; set; }
// Constructor 1: Gọi Constructor 2 với giá trị mặc định
public Rectangle()
: this(1.0, 1.0)
{
}
// Constructor 2: Thiết lập giá trị cụ thể
public Rectangle(double length, double width)
{
this.Length = length;
this.Width = width;
}
}
Giải thích:
: this(1.0, 1.0)
trong Constructor đầu tiên sẽ gọi Constructor thứ hai, giúp tái sử dụng mã nguồn để thiết lập giá trị mặc định.
3. Truyền đối tượng hiện tại làm tham số
Bạn có thể sử dụng this
để truyền đối tượng hiện tại cho một phương thức hoặc lớp khác.
public class Rectangle
{
public double Length { get; set; }
public double Width { get; set; }
public void Print(Rectangle rect)
{
Console.WriteLine($"Length: {rect.Length}, Width: {rect.Width}");
}
public void ShowCurrent()
{
// Truyền đối tượng hiện tại
this.Print(this);
}
}
Giải thích:
- Trong phương thức
ShowCurrent
, từ khóathis
được truyền cho phương thứcPrint
để in thông tin của đối tượng hiện tại.
4. Truy cập chỉ mục trong lớp (Indexer)
this
được sử dụng trong các lớp có chỉ mục (indexer) để truy cập các phần tử:
public class MyCollection
{
private int[] data = new int[5];
public int this[int index]
{
get { return data[index]; }
set { data[index] = value; }
}
}
Giải thích:
this[int index]
là một chỉ mục cho phép truy cập các phần tử của mảngdata
trong đối tượng.
5. Không sử dụng được this
trong phương thức tĩnh
this
không thể được sử dụng trong các phương thức tĩnh (static
) vì phương thức tĩnh không gắn liền với bất kỳ đối tượng cụ thể nào. Chúng thuộc về lớp chứ không thuộc về đối tượng.
public static void StaticMethod()
{
// Lỗi: Không thể sử dụng 'this' trong phương thức tĩnh
// Console.WriteLine(this.Length);
}
Ví dụ tổng hợp
Dưới đây là một ví dụ minh họa đầy đủ về cách sử dụng từ khóa this
:
using System;
public class Rectangle
{
private double length;
private double width;
// Constructor với tham số
public Rectangle(double length, double width)
{
this.length = length;
this.width = width;
}
// Constructor mặc định
public Rectangle()
: this(1.0, 1.0) // Gọi Constructor khác
{
}
// Phương thức tính diện tích
public double CalculateArea()
{
return this.length * this.width;
}
// Phương thức hiển thị thông tin
public void Print()
{
Console.WriteLine($"Rectangle [Length: {this.length}, Width: {this.width}, Area: {this.CalculateArea()}]");
}
// Truyền đối tượng hiện tại làm tham số
public void ShowDetails()
{
this.Print();
}
}
class Program
{
static void Main()
{
// Tạo đối tượng với Constructor mặc định
Rectangle rect1 = new Rectangle();
rect1.ShowDetails();
// Tạo đối tượng với giá trị cụ thể
Rectangle rect2 = new Rectangle(5.0, 3.0);
rect2.ShowDetails();
}
}
Output:
Rectangle [Length: 1, Width: 1, Area: 1]
Rectangle [Length: 5, Width: 3, Area: 15]
Hiểu rõ this
giúp bạn làm việc với lập trình hướng đối tượng trong C# dễ dàng hơn và tạo ra mã nguồn rõ ràng, dễ bảo trì hơn
Tính đóng gói (Encapsulation)
Tính đóng gói cho phép ẩn giấu thông tin chi tiết của đối tượng, chỉ cung cấp các phương thức cần thiết để tương tác với đối tượng.
Ví dụ: Sử dụng các thuộc tính với phạm vi truy cập phù hợp:
public class Rectangle
{
private double length;
private double width;
public double Length
{
get { return length; }
set { length = value; }
}
public double Width
{
get { return width; }
set { width = value; }
}
public double CalculateArea()
{
return length * width;
}
}
Việc hiểu và áp dụng đúng các khái niệm về lớp trong C# giúp bạn xây dựng các ứng dụng theo hướng đối tượng một cách hiệu quả và dễ bảo trì.