কম্পিউটার টিউটোরিয়াল

C#-তে var এবং dynamic-এর পার্থক্য

দ্রুত তুলনা

বিষয়var (Implicitly Typed)dynamic
টাইপ ইনফারেন্সকম্পাইল টাইম (ইনিশিয়ালাইজার থেকে)রানটাইম (DLR ব্যবহার করে)
প্রবর্তনC# 3.0C# 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)
  1. C#-এ TrimStart() এবং TrimEnd() মেথডের পার্থক্য

  2. C#-এ ডাইনামিক টাইপ (dynamic) এবং অবজেক্ট টাইপ (object) ভেরিয়েবলের পার্থক্য

  3. জাভায় স্ট্যাটিক বাইন্ডিং ও ডাইনামিক বাইন্ডিং-এর পার্থক্য

  4. Go এবং Java-এর পার্থক্য