Bài 3: Toán tử và Xử lý chuỗi (String, StringBuilder)
🎯 Mục tiêu bài học
-
Nắm vững các phép toán số học, logic và so sánh cốt lõi.
-
Thao tác cắt, ghép, và định dạng chuỗi (String).
-
Hiểu bản chất cấp phát bộ nhớ của String và biết khi nào phải dùng
StringBuilderđể tối ưu hiệu suất (cực kỳ quan trọng với Backend).
📖 Phần 1: Các Toán tử (Operators) cơ bản
C# hỗ trợ đầy đủ các toán tử giống như hầu hết các ngôn ngữ C-family khác:
-
Toán tử số học:
+,-,*,/,%(chia lấy dư).- Lưu ý: Nếu bạn chia hai số nguyên (vd:
5 / 2), kết quả C# trả về là2(bị ép về nguyên). Để ra2.5, ít nhất một số phải là số thực (vd:5.0 / 2).
- Lưu ý: Nếu bạn chia hai số nguyên (vd:
-
Toán tử tăng/giảm:
++(cộng thêm 1),--(trừ đi 1). -
Toán tử so sánh:
==(bằng),!=(khác),>,<,>=,<=. Kết quả luôn trả vềbool(true/false). -
Toán tử logic:
&&(VÀ),||(HOẶC),!(PHỦ ĐỊNH).- Cơ chế Short-circuit: Trong phép
A && B, nếuAsai, C# sẽ bỏ qua không kiểm traBnữa để tiết kiệm tài nguyên.
- Cơ chế Short-circuit: Trong phép
📖 Phần 2: Xử lý Chuỗi (String)
Chuỗi (string) là kiểu dữ liệu bạn sẽ thao tác nhiều nhất khi làm việc với API, Database hoặc xử lý file.
1. Ghép chuỗi và String Interpolation
Như đã giới thiệu ở bài trước, thay vì dùng dấu + để ghép chuỗi rất rối mắt, hãy luôn ưu tiên dùng String Interpolation (dấu $).
C#
string framework = "ASP.NET Core";
int version = 8;
// Cách hiện đại và dễ đọc nhất:
string message = $"Toi dang hoc {framework} phien ban {version}";
2. Các hàm xử lý chuỗi phổ biến
C# cung cấp sẵn các phương thức cực mạnh để thao tác với chuỗi:
C#
string text = " Backend Developer ";
// 1. Xóa khoảng trắng thừa ở 2 đầu
string trimmed = text.Trim(); // "Backend Developer"
// 2. Chuyển hoa/thường (Rất hữu ích khi tìm kiếm không phân biệt hoa thường)
string upper = trimmed.ToUpper(); // "BACKEND DEVELOPER"
string lower = trimmed.ToLower(); // "backend developer"
// 3. Thay thế chuỗi
string replaced = trimmed.Replace("Backend", "Fullstack"); // "Fullstack Developer"
// 4. Kiểm tra chuỗi có chứa từ khóa không
bool hasDev = trimmed.Contains("Dev"); // true
// 5. Cắt chuỗi thành mảng dựa trên ký tự
string data = "1;Nguyen;2004";
string[] parts = data.Split(';'); // Tạo ra mảng 3 phần tử: "1", "Nguyen", "2004"
📖 Phần 3: Tránh lỗi "Tràn RAM" với StringBuilder
Đây là kiến thức phân biệt một coder nghiệp dư và một Backend Developer thực thụ. Trong C#, String là kiểu dữ liệu bất biến (Immutable). Nghĩa là một khi chuỗi được tạo ra, nó không thể thay đổi. Mỗi lần bạn dùng toán tử + hoặc += để nối thêm nội dung vào chuỗi, C# sẽ tạo ra một vùng nhớ hoàn toàn mới, copy chuỗi cũ sang, cộng chuỗi mới vào, rồi dọn rác vùng nhớ cũ.
Nếu bạn nối chuỗi 10.000 lần trong một vòng lặp, CPU và RAM sẽ phải làm việc cực nhọc, gây sụt giảm hiệu năng nghiêm trọng.
Giải pháp: Dùng StringBuilder StringBuilder cấp phát sẵn một vùng nhớ trống và cho phép bạn nhét thêm dữ liệu vào đó mà không cần tạo mới.
C#
using System.Text; // Phải gọi thư viện này
// Khởi tạo StringBuilder
StringBuilder sb = new StringBuilder();
// Thêm dữ liệu vào đuôi
sb.Append("Select * ");
sb.Append("FROM Users ");
sb.Append("WHERE Age > 18");
// Khi nào cần dùng kết quả cuối cùng mới xuất ra string
string finalQuery = sb.ToString();
Nguyên tắc: Khi cần nối chuỗi dưới 5 lần, dùng string hoặc nội suy $"". Khi nối chuỗi trong vòng lặp hoặc nối số lượng lớn dữ liệu, bắt buộc dùng StringBuilder.
💻 Phần 4: Thực hành
Mở editor và chạy thử đoạn mã làm sạch dữ liệu đầu vào sau đây:
C#
using System;
using System.Text; // Thư viện cho StringBuilder
namespace Lesson3
{
class Program
{
static void Main(string[] args)
{
// Tình huống: Người dùng nhập username rất cẩu thả
string rawInput = " hieu.Nguyen2004 ";
// Bước 1: Cắt khoảng trắng 2 đầu và đưa về chữ thường
string cleanInput = rawInput.Trim().ToLower();
Console.WriteLine($"Du lieu tho: '{rawInput}'");
Console.WriteLine($"Du lieu sach: '{cleanInput}'");
// Bước 2: Dùng StringBuilder tạo một mã đăng nhập
StringBuilder tokenBuilder = new StringBuilder();
tokenBuilder.Append("USER_");
tokenBuilder.Append(cleanInput);
tokenBuilder.Append("_ACTIVE");
Console.WriteLine($"Token sinh ra: {tokenBuilder.ToString()}");
Console.ReadLine();
}
}
}
🛠 Bài tập thực hành
Yêu cầu: Xử lý một đoạn mã lỗi được gửi từ hệ thống. Bạn có một chuỗi log như sau: string logData = "ERROR: Database timeout | IP: 192.168.1.1";
-
Hãy tách chuỗi này ra thành 2 phần, sử dụng ký tự
|làm điểm cắt. (Dùng hàmSplit). -
Thay thế từ
ERRORthànhWARNINGở phần đầu tiên. -
In ra màn hình phần tử IP bằng cách cắt bỏ chữ
IP:thừa đi.
All rights reserved