Garbage Collection là quản lý bộ nhớ tự động trong .NET, hoạt động theo cơ chế:
// Khi không còn reference, object sẽ được GC thu hồi
public void CreateObject()
{
var obj = new MyClass(); // Allocate trên Heap
// Khi method kết thúc, obj không còn reference
// GC sẽ thu hồi bộ nhớ
}
// ❌ Tạo nhiều string objects
string result = "";
for (int i = 0; i < 1000; i++)
{
result += i.ToString(); // Mỗi lần tạo new string
}
// ✅ Sử dụng StringBuilder
var sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
sb.Append(i);
}
string result = sb.ToString();
// Value type - lưu trên Stack
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
// Reference type - lưu trên Heap
public class PointClass
{
public int X { get; set; }
public int int Y { get; set; }
}
// ✅ Tự động gọi Dispose
using var file = new StreamReader("file.txt");
var content = file.ReadToEnd();
// ✅ Hoặc using statement truyền thống
using (var file = new StreamReader("file.txt"))
{
var content = file.ReadToEnd();
}
// ❌ Không nên gọi thủ công trong production
GC.Collect();
// ✅ Có thể dùng sau khi giải phóng large objects
public void Cleanup()
{
largeObject = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
// ✅ Nên dùng struct
public readonly struct Point
{
public double X { get; }
public double Y { get; }
public Point(double x, double y) => (X, Y) = (x, y);
}
// ❌ Không nên dùng struct
public struct LargeObject
{
public byte[] Data { get; set; } // Array - vẫn allocate trên Heap!
}
public bool TryParse(string input, out int result)
{
if (int.TryParse(input, out result))
{
return true;
}
result = 0; // Phải gán trước khi return
return false;
}
if (TryParse("42", out int number))
{
Console.WriteLine(number);
}