Từ C# 7.0, có thể chuyển đổi giữa ValueTuple (struct, hiệu suất cao) và Tuple (class, legacy) bằng phương thức ToTuple() và ToValueTuple() (extension methods trong System.TupleExtensions).
Cài đặt (chỉ .NET Framework cũ)
Cần package System.ValueTuple từ NuGet.
Ví dụ chuyển đổi
// ValueTuple (cú pháp hiện đại)
var val = (5, 50, 500, 5000);
// Chuyển sang Tuple (class)
Tuple myTuple = val.ToTuple();
Console.WriteLine("ValueTuple: " + val);
Console.WriteLine("Tuple: " + myTuple);
Mã nguồn hoàn chỉnh
using System;
class Program
{
static void Main()
{
var val = (5, 50, 500, 5000);
Console.WriteLine("ValueTuple: " + val);
// Chuyển sang Tuple class
Tuple myTuple = val.ToTuple();
Console.WriteLine("Tuple: " + myTuple);
}
}
Kết quả
ValueTuple: (5, 50, 500, 5000)
Tuple: (5, 50, 500, 5000)
Chuyển ngược: Tuple → ValueTuple
// C# 7.3+ / .NET Core 2.0+
Tuple legacy = Tuple.Create(1, 2, 3);
var modern = legacy.ToValueTuple(); // (1, 2, 3)
// Deconstruction
var (a, b, c) = modern;
So sánh hai kiểu
| Đặc điểm | Tuple (Class) | ValueTuple (Struct) |
|---|---|---|
| Namespace | System | System (ValueTuple structs) |
| Kiểu | Reference type | Value type |
| Tên element | Không (Item1...) | Có (named) |
| Deconstruction | Không | Có |
| Mutable | Immutable | Mutable |
| Hiệu suất | Heap allocation | Stack, no GC |
Khi nào dùng chuyển đổi?
- Tương tác với API cũ yêu cầu
Tuple<T>. - Serialization một số thư viện cũ chỉ hỗ trợ Tuple class.
- Code mới: ưu tiên ValueTuple hoàn toàn.