Phương thức Stack.TrimExcess() trong C# được sử dụng để đặt dung lượng (capacity) của Stack bằng số lượng phần tử thực tế, nếu số lượng đó nhỏ hơn một giá trị ngưỡng nhất định. Điều này giúp giải phóng bộ nhớ không sử dụng.
Cú pháp
public void TrimExcess();
Ví dụ 1: Stack kiểu int
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
Stack stack = new Stack();
// Thêm 10 phần tử
stack.Push(100);
stack.Push(150);
stack.Push(175);
stack.Push(200);
stack.Push(225);
stack.Push(250);
stack.Push(300);
stack.Push(400);
stack.Push(450);
stack.Push(500);
Console.WriteLine("Các phần tử trong Stack:");
foreach (var val in stack)
{
Console.WriteLine(val);
}
Console.WriteLine("Số lượng phần tử = " + stack.Count);
Console.WriteLine("Stack có chứa 400? = " + stack.Contains(400));
// Xóa tất cả phần tử
stack.Clear();
// Thu gọn dung lượng
stack.TrimExcess();
Console.WriteLine("Số lượng phần tử (sau cập nhật) = " + stack.Count);
}
}
Kết quả
Các phần tử trong Stack: 500 450 400 300 250 225 200 175 150 100 Số lượng phần tử = 10 Stack có chứa 400? = True Số lượng phần tử (sau cập nhật) = 0
Ví dụ 2: Stack kiểu string
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
Stack stack = new Stack();
stack.Push("A");
stack.Push("B");
stack.Push("C");
stack.Push("D");
stack.Push("E");
stack.Push("F");
stack.Push("G");
stack.Push("H");
Console.WriteLine("Số lượng phần tử = " + stack.Count);
Console.WriteLine("Các phần tử trong Stack...");
foreach (string res in stack)
{
Console.WriteLine(res);
}
Console.Write("Số lượng phần tử (cập nhật) = " + stack.Count);
stack.Clear();
stack.TrimExcess();
Console.WriteLine("\nSố lượng phần tử trong Stack (cập nhật) = " + stack.Count);
}
}
Kết quả
Số lượng phần tử = 8 Các phần tử trong Stack... H G F E D C B A Số lượng phần tử (cập nhật) = 8 Số lượng phần tử trong Stack (cập nhật) = 0
Giải thích
Counttrả về số phần tử thực tế trong Stack.Capacitylà dung lượng nội bộ đã cấp phát (thường lớn hơn Count để tối ưu hiệu suất khi Push).TrimExcess()chỉ giảm Capacity khi Count nhỏ hơn 90% Capacity (ngưỡng mặc định).- Sau
Clear(), Count = 0 nhưng Capacity vẫn giữ nguyên. GọiTrimExcess()sau Clear sẽ giải phóng bộ nhớ.
Khi nào nên dùng TrimExcess()?
- Khi đã xóa lượng lớn phần tử và không dự định thêm nữa.
- Ứng dụng nhạy cảm về bộ nhớ (embedded, mobile).
- Trước khi serialize Stack để giảm kích thước dữ liệu.