تفاوت توابع و متغیرهای Static , Non-Static در c#

تفاوت

رایج ترین راه تعامل و ارتباط با یک کلاس Class، ساخت یک نمونه از آن (شی یا object) و سپس کار کردن بر روی object مورد نظر است. در بیش تر موارد، این کل چیزی است که کلاس شامل می شود، یعنی ساخت چندین نمونه مختلف از یک کلاس و سپس استفاده از هر کدام از آن ها در یک قسمت و یا یک منظور. اما مواردی وجود دارد که تمایل دارید کلاسی داشته باشید که بدون نمونه سازی از آن یا حداقل بدون نیاز به ساخت شی از آن، بتوانید از اعضا و متدهای آن استفاده کنید. برای مثال ممکن است کلاسی داشته باشید که دارای یک متغیر بوده و مقدار این متغیر در همه موارد صرف نظر از محل به کارگیری آن، یکسان است. به این موارد اعضای ثابت یا Static members می گویند، ثابت Static به این دلیل که همواره مقدار آن ها در سطح برنامه یکسان است.
یک کلاس می تواند استاتیک Static بوده و یا دارای اعضا و متدهای Static باشد. یک کلاس ثابت Static Class را نمی توانید نمونه سازی کنید. کلاس های ثابت در واقع مجموعه ای member ها هستند تا یک کلاس به معنای واقعی.
همچنین شما ممکن است یک کلاس معمولی (non-static) ساخته و برای اعضای آن، ثابت تعریف کنید. یک کلاس غیر ثابت non-static را می توانید نمونه سازی کرده و از روی آن object بسازید، اما نمی توانید از اعضای ثابت آن در شی ها استفاده کنید.
کد زیر یک مثال از نحوه تعریف کلاس های ثابت Static Class می باشد :
 
public static class Rectangle
{
    public static int CalculateArea(int width, int height)
    {
        return width * height;
    }
}



همانطور که مشاهده کردید، ما از کلمه کلیدی Static برای مشخص کردن کلاس از نوع ثابت استفاده کرده و همچنین این کلمه کلیدی را نیز برای متد Calculator Area به کار برده ایم. اگر هم برای کلاس و هم برای متد، کلمه کلیدی Static را استفاده نکنید، کامپایلر C# دچار خطا می شود. زیرا یک عضو غیر ثابت (non-Static) را نمی توان در یک کلاس Static تعریف کرد.
برای استفاده از متد Calculator، بایستی آن را همانند کد زیر و به صورت مستقیم با کلاس فراخوانی کرد :
 

Console.WriteLine("The area is: " + Rectangle.CalculateArea(5, 4));

ما می توانیم متدهای کاربردی دیگری را نیز درون کلاس Rectangle Class تعریف کنیم اما شاید این سوال برایتان پیش آمده، که چرا ما پارامترهای width و height را به جای تعریف در کلاس، مستقیما به متد مقصد پاس داده ایم؟
به دلیل این که کلاس فوق به صورت ثابت Static تعریف شده، ما می توانیم مقدار متغیرهای height و width را درون کلاس نگهداری کنیم، اما به صورت ثابت و فقط دارای یک نمونه از مقادیر مثلا 3 و 2 و دیگر نمی توان آن ها را تغییر داد. این نکته مهم را بایستی در کار با توابع Static لحاظ کنید.
به جای کد فوق، می توان با غیر ثابت تعریف کردن کلاس، امکان تغییر و انعطاف پذیری کامل را به کلاس خود بدهید. همانند کد مثال زیر :
 

public class Rectangle
{
    private int width, height;
 
    public Rectangle(int width, int height)
    {
        this.width = width;
        this.height = height;
    }
 
    public void OutputArea()
    {
        Console.WriteLine("Area output: " + Rectangle.CalculateArea(this.width, this.height));
    }
 
    public static int CalculateArea(int width, int height)
    {
        return width * height;
    }
}

همانطور که مشاهده می کنید، کلاس را به صورت غیر ثابت non-Static تعریف کرده ایم. همچنین یک تابع سازنده Construction تعریف شده که مقدار پارامترهای Width و height را به نمونه ساخته از کلاس، نسبت می دهد. در پایان هم متد out put Area را جهت محاسبه مساخت به صورت static تعریف کرده ایم. این مثال نمونه خوبی از ترکیب اعضای غیر ثابت و ثابت در یک کلاس non-static می باشد.
منبع : تحلیل داده

دیدگاه ها (0)

دیدگاه خود را بیان کنید