Tuple
Định nghĩa
Một tuple là cấu trúc dữ liệu nhóm nhiều giá trị thành một đơn vị duy nhất mà không cần định nghĩa một kiểu chuyên biệt. C# hỗ trợ hai hệ thống tuple: System.Tuple cũ hơn (kiểu tham chiếu, C# 4) và System.ValueTuple hiện đại (kiểu giá trị, C# 7+). ValueTuple là cách tiếp cận được khuyến nghị với hỗ trợ ngôn ngữ cấp một cho các phần tử có tên, phân rã (Deconstruction), và khớp mẫu (Pattern Matching).
// Lightweight grouping without a custom type
(int Id, string Name, double Score) result = (1, "Alice", 95.5);
Console.WriteLine($"{result.Name}: {result.Score}"); // Alice: 95.5
Khái niệm cốt lõi
System.Tuple (Tuple tham chiếu)
Được giới thiệu trong .NET Framework 4.0. Các thực thể là kiểu tham chiếu (Reference Type) được cấp phát trên heap. Các phần tử được truy cập dưới dạng Item1, Item2, ..., Item8 — không có hỗ trợ tên phần tử ở cấp ngôn ngữ.
// Creating a Tuple
Tuple<int, string, bool> person = Tuple.Create(1, "Alice", true);
// Accessing elements — no named members
int id = person.Item1;
string name = person.Item2;
bool active = person.Item3;
// Maximum 8 elements; 8th position uses TRest for nesting
var big = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9));
System.Tuple dài dòng, cấp phát trên heap, và không có phần tử có tên ở cấp ngôn ngữ. Ưu tiên System.ValueTuple cho mọi mã mới.
System.ValueTuple (Tuple giá trị)
Được giới thiệu trong C# 7 (.NET Framework 4.7+ / .NET Core). Kiểu giá trị (Value Type) được cấp phát trên ngăn xếp (Stack) với hỗ trợ ngôn ngữ cấp một cho phần tử có tên, phân rã, và so sánh bằng.
// Unnamed elements
(int, string) person1 = (1, "Alice");
int id = person1.Item1;
// Named elements (recommended)
(int Id, string Name) person2 = (2, "Bob");
Console.WriteLine(person2.Name); // Bob
// Target-typed with var
var point = (X: 3.0, Y: 4.0);
Console.WriteLine($"({point.X}, {point.Y})"); // (3, 4)
// No practical element limit
var big = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Các tên như (int Id, string Name) chỉ tồn tại tại thời điểm biên dịch. Tại thời điểm chạy, chúng trở thành Item1 và Item2. Reflection chỉ thấy các tên được đánh số.