Tuple ใน C# 4.0
Tuple<T1, T2, ...> เป็นชนิดข้อมูลที่เก็บค่าหลายค่าที่ชนิดต่างกันได้ในอ็อบเจกต์เดียว ไม่ต้องสร้าง Class/Struct ใหม่ พร้อม Property Item1, Item2, ...
การประกาศ Tuple
// C# 4.0 Style (Class Tuple)
Tuple person = new Tuple(32, "Steve");
// C# 7.0+ ValueTuple (Struct, Better Performance, Named Elements)
(int Age, string Name) person2 = (32, "Steve");
var person3 = (Age: 32, Name: "Steve"); // Type Inference
ตัวอย่าง C# 4.0 Tuple Class
using System;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
Tuple tuple = new Tuple(50, "Tom");
if (tuple.Item1 == 50)
Console.WriteLine(tuple.Item1); // 50
if (tuple.Item2 == "Jack")
Console.WriteLine(tuple.Item2); // ไม่พิมพ์ (ไม่เท่ากัน)
}
}
}
ผลลัพธ์
50
C# 7.0+ ValueTuple (แนะนำให้ใช้)
// Named Elements
var person = (Age: 25, Name: "Alice", Score: 95.5);
Console.WriteLine($"{person.Name} is {person.Age} years old"); // Alice is 25 years old
// Deconstruction
(int age, string name) = person;
Console.WriteLine(age); // 25
// Return Multiple Values
(string, int) GetPerson() => ("Bob", 30);
var (name, age) = GetPerson();
ความแตกต่าง Tuple (Class) vs ValueTuple (Struct)
| คุณสมบัติ | Tuple<T> (Class) | ValueTuple (Struct) |
|---|---|---|
| Memory | Reference Type (Heap) | Value Type (Stack) |
| Performance | ช้ากว่า (Allocation) | เร็วกว่า (No Allocation) |
| Named Elements | ไม่มี (Item1, Item2...) | มี (Name: Type) |
| Mutability | Immutable | Mutable |
| Default Value | null | (default, default...) |
ใช้เมื่อไหร่
- Return หลายค่าจาก Method (แทน out parameters)
- Groupping ข้อมูลชั่วคราว (Ad-hoc Data)
- Dictionary Key แบบ Composite Key