দ্রুত তুলনা
| বিষয় | var (Implicitly Typed) | dynamic |
| টাইপ ইনফারেন্স | কম্পাইল টাইম (ইনিশিয়ালাইজার থেকে) | রানটাইম (DLR ব্যবহার করে) |
| প্রবর্তন | C# 3.0 | C# 4.0 |
| টাইপ পরিবর্তন | সম্ভব না (স্ট্যাটিক টাইপ) | সম্ভব (রানটাইমে ভিন্ন টাইপ) |
| ইনিশিয়ালাইজেশন | বাধ্যতামূলক (ডিক্লেয়ারেশনে) | অপশনাল |
| IntelliSense | পূর্ণ সাপোর্ট | না (রানটাইমে জানা যায়) |
| পারফরম্যান্স | নেটিভ (ওভারহেড নেই) | धीম (DLR ক্যাশে, কলসাইট) |
| এরর ধরা | কম্পাইল টাইম | রানটাইম (RuntimeBinderException) |
| রিফলেকশন দরকার | না | হ্যাঁ (অন্ডারলাইন্ড) |
var উদাহরণ
using System;
using System.Collections.Generic;
var number = 42; // int
var text = "Hello"; // string
var list = new List<int>(); // List
var anon = new { Name = "John", Age = 30 }; // Anonymous type
// var number; // ❌ Error: Must be initialized
// number = "string"; // ❌ Error: Cannot convert string to int
dynamic উদাহরণ
dynamic value = 42; // int
Console.WriteLine(value.GetType()); // System.Int32
value = "Hello"; // string — টাইপ পরিবর্তন!
Console.WriteLine(value.GetType()); // System.String
value = new List<int> { 1, 2, 3 };
value.Add(4); // রানটাইমে মেথড রিজল্ভ
// অস্তিত্বহীন মেম্বার — কম্পাইল করবে, রানটাইমে ফেলবে
try {
value.NonExistentMethod();
} catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex) {
Console.WriteLine($"Runtime error: {ex.Message}");
}
// dynamic নাল হতে পারে
dynamic d = null;
// d.ToString(); // RuntimeBinderException: Cannot perform runtime binding on a null reference
var ব্যবহার করার কারণ (Best Practices)
- অ্যানোনিমাস টাইপ: LINQ কোয়েরি রেজাল্ট, প্রজেকশন
- জেনেরিক টাইপ দীর্ঘ হলে:
var dict = new Dictionary<string, List<Tuple<int, string>>>();
- রিডেবিলিটি: ডান পক্ষ থেকে টাইপ স্পষ্ট হলে
- রিফ্যাক্টরিং: রিটার্ন টাইপ পরিবর্তন করলে ভেরিয়েবল টাইপ অটো-অ্যাডজাস্ট
dynamic ব্যবহার করার কারণ (Limited Cases)
- JSON/ডাইনামিক অবজেক্ট:
dynamic data = JsonConvert.DeserializeObject(json);
- COM אינ্টারঅপ: Office অটোমেশন (Excel, Word)
- IronPython/IronRuby: ডাইনামিক ল্যাঙ্গুয়েজ ইন্টারঅপ
- রিফলেকশন ساده:
dynamic obj = Activator.CreateInstance(type);
- Entity Framework: ডাইনামিক কোয়েরি, এন্টিটি প্রক্সি
সতর্কতা: dynamic ওভারইউজ করবেন না
// ❌ খারাপ: পাবলিক API-তে dynamic
public dynamic GetData() { ... } // কলারকে টাইপ জানতে হবে না — ডেঞ্জারাস
// ✅ ভালো: প্রাইভেট মেথডে JSON পার্সিং
private dynamic ParseJson(string json) => JsonConvert.DeserializeObject(json);
// ✅ ভালো: COM কল
dynamic excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
excel.Visible = true;
ExpandoObject — ডাইনামিক প্রপার্টি (C# 4.0+)
using System.Dynamic;
dynamic person = new ExpandoObject();
person.Name = "John";
person.Age = 30;
person.SayHi = new Action(() => Console.WriteLine($"Hi, {person.Name}"));
person.SayHi(); // Hi, John
// প্রপার্টি ডাইনামিক্যালি যোগ/মুছে ফেলা
person.City = "Dhaka";
((IDictionary<string, object>)person).Remove("Age");
সারাংশ
var = Static typing with inference (Compile-time safety, zero overhead)
dynamic = Dynamic typing (Runtime resolution, DLR overhead, use sparingly)