Tuple হলো একাধিক মান একসাথে রাখার জন্য হালকা ও নেমড/অনেমড ডেটা স্ট্রাকচার। C# 7.0+ এ ValueTuple (স্ট্রাক্ট) معرفی হয়েছে যা পারফরম্যান্সে ভালো এবং সিনট্যাক্স সুবিধাজনক।
কখন ব্যবহার করবেন?
- একাধিক রিটার্ন ভ্যালু:
out/refবা কাস্টম ক্লাস ছাড়া - একাধিক আর্গুমেন্ট একসাথে পাস: সিঙ্গেল প্যারামিটার হিসেবে
- টেম্পোরারি ডেটা গ্রুপিং: ক্লাস/স্ট্রাক্ট বানানোর ঝামেলা নেই
- LINQ কোয়েরি রেজাল্ট: অ্যানোনিমাস টাইপের বদলে
- Deconstruction: প্যাটার্ন ম্যাচিং, সোয়াপিং
টাপল সিনট্যাক্স (C# 7.0+)
// nommé tuple (নেমড)
var person = (Name: "John", Age: 30, City: "Dhaka");
Console.WriteLine($"{person.Name}, {person.Age}");
// unnamed tuple
var coords = (10, 20);
Console.WriteLine($"{coords.Item1}, {coords.Item2}");
// টাইপ ডিক্লেয়ারেশন
(string Name, int Age) GetPerson() => ("Alice", 25);
উদাহরণ ১: টাপল প্যারামিটার হিসেবে পাস
using System;
class Program {
static void DisplayTupleValues((int Id, string Value1, string Value2) dummy) {
Console.WriteLine($"Id = {dummy.Id}");
Console.WriteLine($"Value1 = {dummy.Value1}");
Console.WriteLine($"Value2 = {dummy.Value2}");
}
static void Main() {
var dummy = (1, "Dummy", "Tuple");
DisplayTupleValues(dummy);
Console.ReadLine();
}
}
আউটপুট:
Id = 1 Value1 = Dummy Value2 = Tuple
উদাহরণ ২: টাপল রিটার্ন টাইপ হিসেবে
static (int Id, string Value1, string Value2) ReturnTuple() {
return (1, "Value1", "Value2");
}
static void Main() {
var result = ReturnTuple();
Console.WriteLine($"{result.Id} {result.Value1} {result.Value2}");
// Deconstruction
var (id, v1, v2) = ReturnTuple();
Console.ReadLine();
}
আউটপুট:
1 Value1 Value2
পুরানো Tuple ক্লাস (System.Tuple) — লিগেসি
// পুরানো ক্লাস-বেজড Tuple (রেফারেন্স টাইপ, হিপ অ্যালোকেশন)
var oldTuple = Tuple.Create(1, "Hello", "World");
Console.WriteLine(oldTuple.Item1); // 1
Console.WriteLine(oldTuple.Item2); // Hello
সুপারিশ: C# 7.0+ এ ValueTuple (স্ট্রাক্ট, স্ট্যাক-অ্যালোকেটেড, ফাস্ট) ব্যবহার করুন।
উন্নত ব্যবহার: Deconstruction
var (x, y) = (10, 20); // x=10, y=20
// সোয়াপিং - টেম্প ভেরিয়েবল ছাড়া
(a, b) = (b, a);
// প্যাটার্ন ম্যাচিং (C# 9+)
if (person is (Name: "Admin", Age: >= 18)) { ... }
সীমাবদ্ধতা
- পাবলিক API-তে টাপল রিটার্ন করলে ডকুমেন্টেশন কম স্পষ্ট হয় (কাস্টম রেকর্ড/ক্লাস ভালো)
- সিরিয়ালাইজেশন (JSON) এ নেমড টাপলের নাম প্রিজার্ভ নাও হতে পারে
- রিফলেকশনে টাপল এলিমেন্ট অ্যাক্সেস করা জটিল