Lesson ৭ মিনিট পড়া

মেথডস (Methods)

একবার লিখুন, সব জায়গায় ব্যবহার করুন — এটাই রিইউজেবল বা পুনরায় ব্যবহারযোগ্য কোডের শক্তি

মেথড কী? (What Is a Method?)

একটি মেথডকে (method) রান্নার একটি রেসিপির (recipe) মতো ভাবতে পারেন। আপনি এর একটি নাম দেন ("যেমন- প্যানকেক_তৈরি"), এর জন্য কী কী উপকরণ লাগবে তার একটি তালিকা তৈরি করেন (যাকে বলা হয় প্যারামিটার), এবং তারপর রান্নার ধাপগুলো লিখে ফেলেন (যাকে বলা হয় মেথডের বডি)। এরপর, আপনার যখনই প্যানকেক খেতে ইচ্ছা করবে, আপনাকে আর কষ্ট করে সব ধাপ নতুন করে লিখতে হবে না, শুধু নাম ধরে রেসিপিটিকে ডাকলেই (call) কাজ হয়ে যাবে!

মেথড আপনাকে যেসব কাজে সাহায্য করে:

  • একই কাজ বারবার করা থেকে বাঁচায় — একবার লিখুন, আর ১০০ বার কল (call) করুন
  • কোড গুছিয়ে রাখতে সাহায্য করে — বড় বড় সমস্যাগুলোকে ছোট এবং নামযুক্ত (named) টুকরোতে ভাগ করে নেয়
  • সহজে টেস্ট বা পরীক্ষা করা যায় — আপনি চাইলে প্রতিটি মেথডকে আলাদা আলাদাভাবে টেস্ট করে দেখতে পারেন

প্রতিটি মেথডই কিছু না কিছু ফেরত দেয়, যাকে রিটার্ন টাইপ (return type) বলা হয়, এবং এরা কিছু প্যারামিটার (parameters) বা ইনপুট (input) গ্রহণ করতে পারে। যদি কোনো মেথড কিছুই ফেরত না দেয়, তবে তার রিটার্ন টাইপ হয় void

মেথড বেসিকস (Basic Methods)

// Method that returns a value
static int Add(int a, int b)
{
return a + b;
}
// Method that returns nothing (void)
static void Greet(string name)
{
Console.WriteLine($"Hello, {name}! Welcome aboard.");
}
// Expression-bodied method (short version with =>)
static double CircleArea(double radius) => Math.PI * radius * radius;
// Calling the methods
int sum = Add(5, 3);
Console.WriteLine($"5 + 3 = {sum}");
Greet("Laboni");
double area = CircleArea(5);
Console.WriteLine($"Circle area (r=5): {area:F2}");
Output
5 + 3 = 8
Hello, Laboni! Welcome aboard.
Circle area (r=5): 78.54

প্যারামিটার: ref, out এবং অপশনাল (Parameters: ref, out, and Optional)

সাধারণত, যখন আপনি কোনো মেথডের কাছে একটি ভ্যারিয়েবল পাঠান, তখন সি শার্প (C#) আসলে সেই ভ্যারিয়েবলের একটি কপি (copy) বা অনুলিপি পাঠায়। তাই মেথডটি চাইলেও আসল ভ্যারিয়েবলটির কোনো পরিবর্তন করতে পারে না। কিন্তু অনেক সময় আপনার মনে হতে পারে যে, মেথডটি যেন আসল ভ্যারিয়েবলটিকে পরিবর্তন করতে পারে — আর ঠিক এখানেই ref এবং out এর কাজ শুরু হয়।

  • ref — "আমি তোমাকে আমার আসল ভ্যারিয়েবলটি ধার দিচ্ছি। তুমি চাইলে এটি পড়তে পারো এবং পরিবর্তনও করতে পারো।" তবে এই ক্ষেত্রে, মেথডে পাঠানোর আগেই ভ্যারিয়েবলটির একটি মান অ্যাসাইন (assign) বা ইনিশিয়ালাইজ (initialize) করা থাকতে হবে।
  • out — "আমি তোমাকে একটি খালি বাক্স দিচ্ছি। তোমাকে অবশ্যই এটি পূরণ করে দিতে হবে।" এই ক্ষেত্রে, ভ্যারিয়েবলটিকে মেথডে পাঠানোর আগে কোনো মান অ্যাসাইন বা ইনিশিয়ালাইজ করার দরকার নেই।
  • অপশনাল প্যারামিটার (Optional parameters) — এগুলো হলো এমন প্যারামিটার বা ইনপুট, যেগুলোর আগে থেকেই একটি ডিফল্ট (default) মান দেওয়া থাকে। মেথড কল করার সময় কলার (caller) যদি এগুলোর মান না দেয়, তখন ওই ডিফল্ট মানটি কাজ করা শুরু করে।

ref, out এবং অপশনাল প্যারামিটার (ref, out, and Optional Parameters)

// ref — modifies the original variable
static void DoubleIt(ref int number)
{
number *= 2;
}
// out — must assign a value inside the method
static void Divide(int a, int b, out int quotient, out int remainder)
{
quotient = a / b;
remainder = a % b;
}
// Optional parameters with defaults
static string MakeTag(string text, string color = "blue", int size = 14)
{
return $"<span style='color:{color}; font-size:{size}px'>{text}</span>";
}
// Using ref
int value = 10;
DoubleIt(ref value);
Console.WriteLine($"After DoubleIt: {value}");
// Using out
Divide(17, 5, out int q, out int r);
Console.WriteLine($"17 / 5 = {q} remainder {r}");
// Using optional params
Console.WriteLine(MakeTag("Hello")); // uses defaults
Console.WriteLine(MakeTag("Warning", "red")); // override color
Console.WriteLine(MakeTag("Title", "green", 24)); // override both
Output
After DoubleIt: 20
17 / 5 = 3 remainder 2
<span style='color:blue; font-size:14px'>Hello</span>
<span style='color:red; font-size:14px'>Warning</span>
<span style='color:green; font-size:24px'>Title</span>

মেথড ওভারলোডিং — একই নাম, তবে ভিন্ন সিগনেচার (Method Overloading — Same Name, Different Signatures)

// Same method name, different parameter lists
static string Describe(int number)
=> $"{number} is a whole number";
static string Describe(double number)
=> $"{number} is a decimal number";
static string Describe(string text)
=> $"\"{text}\" is a string with {text.Length} characters";
static string Describe(int a, int b)
=> $"{a} and {b} add up to {a + b}";
// C# picks the right overload based on what you pass
Console.WriteLine(Describe(42));
Console.WriteLine(Describe(3.14));
Console.WriteLine(Describe("hello"));
Console.WriteLine(Describe(10, 20));
Output
42 is a whole number
3.14 is a decimal number
"hello" is a string with 5 characters
10 and 20 add up to 30
Note: 🎯 এক লাইনে লেখা মেথডগুলোর জন্য এক্সপ্রেশন-বডিড মেমবার (Expression-bodied members, => সহ) চমৎকার কাজ করে। কিন্তু আপনার মেথডটি যদি একাধিক লাইন বা স্টেটমেন্ট (statement) জুড়ে থাকে, তবে সাধরন { } ব্লক ব্যবহার করুন। অযথাই জটিল লজিকগুলোকে (logic) তীরের (arrow) মতো এই চিহ্নের মাঝে আটকে রাখবেন না — অতিরিক্ত চালাকি করার চেয়ে কোড সহজে পড়তে পারাটা অনেক বেশি জরুরি।
চ্যালেঞ্জ

ছোট কুইজ

রিটার্ন টাইপ (return type) হিসেবে 'void' বলতে কী বোঝায়?
Arrays & ListsClasses & Objects