Wednesday, October 11, 2017

C# For Beginners , Part-20 (Static & Instance Class Member )

আজকে আমরা মজার একটা বিষয় নিয়ে কথা বলবো ।। আর সেটা হলো  , স্ট্যাটিক ও ইন্সট্যান্স ক্লাস মেম্বার .।। আমরা এর আগে স্ট্যাটিক ও ইন্সট্যান্স মেথড নিয়ে পড়েছি , বাট আজকে এদের ক্লাস মেম্বার নিয়ে কথা বলবো ।। চলো , আগে একটা সহজ একটা কোড দেখে আসি ----------

using System;

class Circle
{
    double pi = 3.1456;
    int _radius;
    public Circle(int Radius)
    {
        this._radius=Radius;
    }
    public double GetArea()
    {
        return this.pi * this._radius * this._radius;
    }
   
}

class Program
{
    public static void Main()

    {
        Circle c1 = new Circle(6);
        double area = c1.GetArea();
        Console.WriteLine(area);
        Circle c2 = new Circle(5);
        double area2 = c2.GetArea();
        Console.WriteLine(area2);
        Console.ReadKey();
    }
}





Circle নামক ক্লাসের দুইটা ক্লাস ফিল্ড একটা  pi  ও  আরেকটা  _radius  ।। দুইটাই ইন্সট্যান্স ক্লাস মেম্বার ।।  pi  তো ইনিশিয়ালাইজ করাই আছে , এখন  _radius  ক্লাস ফিল্ড-কে ইনিসিয়ালাইজ করতে , একটা কন্সট্রাক্টর ইউজ করলাম ।।

 তারপর একটা , GetArea নামে মেথড ক্রিয়েট করলাম ।। এখন Program নামক ক্লাসের অন্তর্ভুক্ত
মেইন মেথড -এ এসে , Circle নামক ক্লাসের দুইটা ইন্সট্যান্স ( অব্জেক্ট ) ক্রিয়েট করলাম ।। দুই ক্ষেত্রেই , আমি দুই মানের প্যারামিটার পাস করেছি একবার 6 আরেকবার  5 ।। তো প্রতিবারই , মেমোরিতে আলাদা অবজেক্ট ক্রিয়েট করছি , যার ভেতরে pi ও  _radius  বার বার কপি হয়েছে , আমরা যতোবার অব্জেক্ট ক্রিয়েট করবো , ততোবারই এই দুটি জিনিস বার বার কপি হবে । ।

 কিন্তু , আমরা কিন্তু বুঝতেই পারছি যে --- পাই এর মান'টা কন্সট্যান্ট তাই আমরা , এটাকে ইন্সট্যান্স ক্লাস মেম্বার হিসেবে না ব্যবহার  করে , স্ট্যাটিক ক্লাস মেম্বার হিসেবে ইউজ করতে পারি ।। তাহলে , আমরা যতোবারই অবজেক্ট / ইন্সট্যান্স ক্রিয়েট করি না কেনো , পাই এর মান কপি হবে না , তাতে মেমোরি'র কিছুটা হলেও সাশ্রয় হবে ।।তো চলো , করেই দেখি - কেমন হয় ?????

using System;

class Circle
{
    static double pi = 3.1456;
    int _radius;
    public Circle(int Radius)
    {
        this._radius=Radius;
    }
    public double GetArea()
    {
        return Circle.pi * this._radius * this._radius;
    }
}
class Program
{
    public static void Main()

    {
        Circle c1 = new Circle(6);
        double area = c1.GetArea();
        Console.WriteLine(area);
        Circle c2 = new Circle(5);
        double area2 = c2.GetArea();
        Console.WriteLine(area2);
        Console.ReadKey();
    }
}

এখানে , আমাদের কি কি পরিবর্তন হয়েছে ? চিন্তা করো তো ।। আমরা , পাই কে স্ট্যাটিক ক্লাস মেম্বার হিসেবে ব্যবহার করেছি ।। তাই , GetArea এর মেথডের ভিতরে   return Circle.pi * this._radius * this._radius;ইউজ করেছি । আগেরবার কিন্তু , আমরা  return this.pi * this._radius * this._radius; ইউজ করেছিলাম ।।

কিন্তু , গতোবার ইন্সট্যান্স ক্লাস মেম্বার ছিলো - তাই ইন্সট্যান্স ক্রিয়েট করে কাজ করেছিলাম , কিন্তু  এইবার কিন্তু এই কাজ ভুলেও করা যাবে না ।। কারণ , এইবার আমরা স্ট্যাটিক ক্লাস মেম্বার ইউজ করেছি , তাই এবার - শুধু ডট অপারেটরের সাহায্যে ক্লাসের নাম জুড়ে দিলেই হবে   (Circle.pi ) ।।

আচ্ছা , অনেকেরই মনে হতে পারে ।। আমরা যেমন , ইন্সট্যান্স ক্লাস মেম্বার এর জন্য কন্সট্রাক্টর ইউজ করেছি , ঠিক সেইভাবেই - স্ট্যাটিক ক্লাস মেম্বার এর জন্যও , কন্সট্রাক্টর ইউজ করবো ।।
চলো , কিভাবে এই ক্ষেত্রে  - কন্সট্রাক্টর ব্যবহার করতে হয় ?? দেখে আসি ----------------

using System;

class Circle
{
    static double pi;
    int _radius;
    static Circle()
    {
        Circle.pi = 3.1456;
    }
    public Circle(int Radius)
    {
        this._radius=Radius;
    }
    public double GetArea()
    {
        return Circle.pi * this._radius * this._radius;
    }
   
}

class Program
{
    public static void Main()

    {
        Circle c1 = new Circle(6);
        double area = c1.GetArea();
        Console.WriteLine(area);
        Circle c2 = new Circle(5);
        double area2 = c2.GetArea();
        Console.WriteLine(area2);
        Console.ReadKey();
    }
}

একটা জিনিস মনে রাখা উচিত আমাদের , ইন্সট্যান্স কন্সট্রাক্টরের মতো স্ট্যাটিক কন্সট্রাক্টরের ব্যবহারের সময়  Access Modifier হিসেবে public / private ইউজ করা যাবে না ।। এটা অটোমেটিক কল হবে , সমস্যা হবে না । কিন্তু , ইন্সট্যান্স কন্সট্রাক্টরের সময় কিন্তু -- public লিখে দিতে হবে , অন্যথায় - ডিফলটভাবে এটা private হয়ে যাবে , যখন একই ক্লাসের বাইরে থেকে আর অ্যাকসেস করা যাবে না ।।

স্ট্যাটিক কন্সট্রাক্টর যদি কখনো ইউজ করা হয় , সেটা শুধু একবারই কল হবে এবং ,সেটা অটোমেটিক সবসময় আগে কল হয় , চলো একটা উদাহরণ দেখে আসি ----------------

using System;

class Circle
{
    public static double pi;
    int _radius;
    static Circle()
    {
        Circle.pi = 3.1456;
        Console.WriteLine("This is static");
    }
    public Circle(int Radius)
    {
        Console.WriteLine("This is instanse");
        this._radius=Radius;
    }
    public double GetArea()
    {
        return Circle.pi * this._radius * this._radius;
    }
   
}

class Program
{
    public static void Main()

    {
        Circle t = new Circle(5);
        double area=t.GetArea();
        Console.WriteLine(area);
        Console.ReadKey();
    }
}

আমরা এখানে ,  Circle ক্লাসের একটা অবজেক্ট মাত্র ক্রিয়েট করেছি , আমি যদি একশটা অবজেক্টও ক্রিয়েট করতাম , তাহলেও --- ঐ প্রথম একবারই স্ট্যাটিক কন্সট্রাক্টর'টি কল হবে ।। নিজে নিজে প্র্যাক্টিস করো , আরো ভালো বুঝতে পারবে ,  তো যাই হোক , আজ এইটুকুই ------------------------------












No comments:

Post a Comment