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

C#-তে ref, out, এবং in কীওয়ার্ডের ব্যবহার


C#-তে অধিকাংশ মেথডে শূন্য বা অধিক প্যারামিটার থাকতে পারে যা মেথডে প্রদান করতে হয় সেই ডেটা ডিফাইন করে। যে কোড মেথডটি কল করে, সেটি ডেটা (যাকে আর্গুমেন্ট বলা হয়) মেথডে পাস করতে হয়। একটি মেথড তার ইনপুটগুলো প্যারামিটার হিসেবে ডিক্লেয়ার করে, এবং সেগুলো কলিং কোড দ্বারা আর্গুমেন্ট হিসেবে প্রদান করা হয়।

উদাহরণস্বরূপ, নিচের মেথড এবং পরবর্তী মেথড কল বিবেচনা করুন।

static void Greet(string greeting){     Console.WriteLine(greeting); } ... Greet("Hello");

উপরের উদাহরণে, greeting হলো Greet() মেথডের একটি প্যারামিটার, এবং "Hello" হলো মেথডে পাস করা একটি আর্গুমেন্ট।

আপনি যখন একটি মেথড কল করেন এবং আর্গুমেন্ট পাস করেন, সেগুলো ভ্যালু দিয়ে পাস হয়, অর্থাৎ মেথডে পাস করার সময় ভ্যালুর একটি কপি তৈরি হয়। মেথডের ভিতরে আর্গুমেন্টে যেকোনো পরিবর্তন মূল ভেরিয়েবলে প্রতিফলিত হয় না।

using System; int number = 8; Increase(number); Console.WriteLine(number); // prints 8 static void Increase(int num){     num = num + 1;     Console.WriteLine(num); // prints 9 }

যখন আপনি একটি রেফারেন্স টাইপ ভেরিয়েবল পাস করেন, যেমন একটি অবজেক্ট, C# যাইহোক রেফারেন্স-কে ভ্যালু দিয়ে কপি করে, কারণ ভেরিয়েবলটি রেফারেন্স ধারণ করে, نه আসল অবজেক্ট। তাই যাইহোক রেফারেন্স ভেরিয়েবলের একটি কপি পাস করা হয়, যেসবই মেমরিতে একই অবজেক্টকে রেফার করে। তাই মেথডের ভিতরে ভেরিয়েবল দ্বারা অবজেক্টে করা যেকোনো পরিবর্তন মেথডের বাইরের ভেরিয়েবলদ্বারা দৃশ্যমান হয়।

using System; var john = new User{     Name = "John",     Salary = 50000 }; Promote(john); Console.WriteLine(john.Salary); // prints 60000 static void Promote(User u){     u.Salary += 10000;     Console.WriteLine(u.Salary); // prints 60000 }

তবে, যদি আপনি মেথডের ভিতরে ভেরিয়েবলের ভ্যালুই পরিবর্তন করেন, তবে সেই পরিবর্তন বাইরে প্রতিফলিত হয় না, কারণ শুধু কপিটি পরিবর্তন হয়েছে, আসল অবজেক্ট নয়। উদাহরণস্বরূপ, আমরা মেথডের ভিতরে আর্গুমেন্টকে নাল অ্যাসাইন করতে পারি, এবং আসল ভেরিয়েবল অপরিবর্তিত থাকবে।

using System; var john = new User{     Name = "John",     Salary = 50000 }; Promote(john); Console.WriteLine(john.Salary); // prints 50000 static void Promote(User u){     u = null; }

C# তিনটি ভিন্ন মডিফায়ার কীওয়ার্ড দিয়ে আপনাকে মেথড প্যারামিটার কন্ট্রোল করার অনুমতি দেয়।

ref মডিফায়ার

C# আপনাকে ref মডিফায়ার ব্যবহার করে প্যারামিটার রেফারেন্স দিয়ে পাস করার অনুমতি দেয়। ভেরিয়েবলটি রেফারেন্স টাইপের হোক বা ভ্যালু টাইপের, কোন ফরক নেই। প্যারামিটার এবং আর্গুমেন্ট দুটোই একই মেমরি লোকেশনকে রেফার করবে।

নিচের উদাহরণে, আর্গুমেন্ট u-কে নাল সেট করলে john ভেরিয়েবলটিও নাল হয়ে যাবে, যার ফলে নাল রেফারেন্স এক্সেপশন হবে।

উদাহরণ

using System; var john = new User{     Name = "John",     Salary = 50000 }; Promote(ref john); Console.WriteLine(john.Salary); // throws System.NullReferenceException static void Promote(ref User u){     u = null; }

ref মডিফায়ারের সাথে পাস করা একটি আর্গুমেন্ট পাস করার আগে অবশ্যই ইনিশিয়ালাইজড থাকতে হবে।

out মডিফায়ার

এটি ref মডিফায়ারের মত, ছাড়া

  • আর্গুমেন্ট ফাংশনে যাওয়ার আগে ইনিশিয়ালাইজড থাকতে হয় না

  • ফাংশন থেকে বের হওয়ার আগে আর্গুমেন্ট অবশ্যই ইনিশিয়ালাইজড (অ্যাসাইন করা) থাকতে হবে।

নিচের উদাহরণে, Hire ফাংশন out মডিফায়ারের মাধ্যমে পাস করা একটি নতুন ইউজার অবজেক্ট ইনিশিয়ালাইজ করে। লক্ষ্য করুন যে john ভেরিয়েবলটি Hire মেথড কল করার সময়ই অন-দ-ফ্লাই ডিক্লেয়ার করা হয়েছে।

using System; Hire(out User john); Console.WriteLine(john.Salary); // prints 50000 static void Hire(out User u){     u = new User{         Name = "John",         Salary = 50000     }; }

ref মডিফায়ারের মতো, out মডিফায়ার দিয়ে চিহ্নিত একটি ভেরিয়েবল রেফারেন্স দিয়ে পাস হয়।

প্রায়শই একটি out ভেরিয়েবল ব্যবহার করা হয় একটি ফাংশন থেকে একাধিক রিটার্ন ভ্যালু পাওয়ার জন্য নিচের মত —

using System; var john = new User{     Name = "John",     Salary = 50000 }; bool shouldPromote = Raise(john.Salary, out double hike); Console.WriteLine(shouldPromote); // True Console.WriteLine($"Hike Amount = {hike}"); // prints 5000 static bool Raise(int salary, out double hike){     hike = salary * 0.1;     return hike < 7000; }

in মডিফায়ার

এটি ref এবং out প্যারামিটারগুলির মত, ছাড়া in আর্গুমেন্ট গ্রহণকারী মেথড আর্গুমেন্টের ভ্যালু মডিফাই করতে পারবে না। যদি চেষ্টা করে, তবে C# কম্পাইলার কম্পাইল-টাইম এরর জেনারেট করবে।

in প্যারামিটার কম্পাইলারকে একটি বড় ভ্যালু টাইপের মেমরি প্যারামিটার ভেরিয়েবলে কপি করার থেকে বাঁচায়, একই সাথে অবজেক্টকে অকস্মাত মডিফিকেশন থেকে বাঁচায়। এটি বড় ভ্যালু টাইপ মেথডে পাস করার সময় খুব উপযোগী হয়।

var point = new Coord(); Verify(point); static void Verify(in Coord c){     // error: Cannot assign to variable 'in Coord' because it is a readonly variable     c = new Coord(); } struct Coord{     public int X;     public int Y; }

উদাহরণ

using System; class Program{     static void Main(){         int number = 8;         Increase(number);         Console.WriteLine(number); // prints 8         var john = new User { Name = "John", Salary = 50000 };         Promote(john);         Console.WriteLine(john.Salary); // prints 60000         Leave(john);         Console.WriteLine(john.Salary); // prints 60000         LeaveByRef(ref john);         Console.WriteLine(john?.Salary); // prints nothing         User dave;         Hire(out dave);         Console.WriteLine(dave.Salary); // prints 50000     }     static void Increase(int num){         num = num + 1;         Console.WriteLine(num); // prints 9     }     static void Promote(User u){         u.Salary += 10000;         Console.WriteLine(u.Salary); // prints 60000     }     static void Leave(User u){         u = null;     }     static void LeaveByRef(ref User u){         u = null;     }     static void Hire(out User u){         u = new User{             Name = "John",             Salary = 50000         };     } } class User{     public string Name { get; set; }     public int Salary { get; set; } }

আউটপুট

9 8 60000 60000 60000 50000
  1. C#-এ ইন্টারফেস (Interface) এবং ক্লাস (Class) এর পার্থক্য

  2. C#-এ String (ক্লাস) এবং string (এলিয়াস) এর পার্থক্য

  3. C#-এ ref এবং out প্যারামিটার এর পার্থক্য

  4. পাইথনে =+ এবং += অপারেটরের পার্থক্য