آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

پارامتر متد در سی شارپ (C# method parameter)

دوره های مرتبط با این مقاله

همانطور که می دانیم به توابع داخل یک کلاس متد گوییم. همانند دیگر توابع یک متد نیز ممکن است داده ای برای انجام عملیات مورد نظرش از محل فراخوان بپذیرد که به آن پارامتر ورودی گفته می شود. در این مقاله به آموزش پارامترهای متد در سی شارپ و انواع آن خواهیم پرداخت.

هنگام فراخوانی متدی که چندین پارامتر ورودی می پذیرد، گفتیم که ابتدا باید مقدارهای مورد نیاز این پارامترها را فراهم کنیم. این به آن خاطر است که وجود پارامترها الزامی بوده و متد فراخوان (calling method) باید برای هر یک از پارامترها مقداری معتبر ارائه دهد. به این روش از ارایه ی مقدار برای پارامترها، روش ارسال آرگومان با استفاده از مقدار یا Call by Value گفته می شود.

حالت اول: ارسال آرگومان با استفاده از مقدار

هنگام فراخوانی متدی که چندین آرگومان می گیرد، گفتیم که ابتدا باید مقدارهای مورد نیاز آرگومان ها را فراهم کنیم. این به آن خاطر است که (وجود) آرگومان الزامی بوده و متد فراخوان (calling method) باید (هنگام فراخوانی متدی که چندین آرگومان دارد) مقداری معتبر ارائه دهد. به این روش از ارائه ی مقدار برای آرگومان، روش ارسال آرگومان با استفاده از مقدار گفته می شود.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپنحوه ی ارسال پارامتر با استفاده از مقدار

  1. Microsoft Visual Studio را اجرا کنید.
  2. برای ایجاد برنامه ی کاربردی جدید، به فهرست اصلی مراجعه کرده و گزینه های File -> New Project... را کلیک کنید.
  3. Empty Project را از لیست میانی انتخاب کنید.
  4. اسم را به NationalBank1 تغییر داده، سپس کلید Enter را فشار دهید.
  5. به منظور ایجاد فایل جدید، در Solution Explorer، راست کلیک کرده و طبق دستور زیر به پیش بروید : NationalBank1 -> Add -> New Item....
  6. در لیست میانی روی Code File کلیک کنید.
  7. اسم فایل را به Management تغییر دهید.
  8. روی گزینه ی Add کلیک کنید.
  9. در فایل خالی Management.cs، دستورات زیر وارد کنید.
            
public class Management
{
    private void ShowAccountInformation(string acntNbr, string name,
                                        short PIN, double balance)
    {
        System.Console.WriteLine("==============================");
        System.Console.WriteLine("Account Information");
        System.Console.WriteLine("------------------------------");
        System.Console.Write("Account #:     ");
        System.Console.WriteLine(acntNbr);
        System.Console.Write("Customer Name: ");
        System.Console.WriteLine(name);
        System.Console.Write("PIN:           ");
        System.Console.WriteLine(PIN);
        System.Console.Write("Balanace:      ");
        System.Console.WriteLine(balance);
        System.Console.WriteLine("==============================");
    }

    public static int Main()
    {
        Management man = new Management();
        string accountNumber  = "248-050842-749";
        string customerName   = "Ann Kelley";
        short  pin            = 8648;
        double currentBalance = 350.00D;
        man.ShowAccountInformation(accountNumber, customerName, pin, currentBalance);
        System.Console.ReadKey();
        return 0;
    }
}
  1. برای اجرای دستورات، کلید F5 را فشار دهید.
==============================
Account Information
------------------------------
Account #:     248-050842-749
Customer Name: Ann Kelley
PIN:           8648
Balanace:      350
==============================
  1. پس از مشاهده ی نتایج، با فشار دادن کلید Enter از پنجره ی DOS خارج شوید.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ ارسال پارامتر با استفاده از ارجاع

برنامه ی زیر را در نظر بگیرید.

public class Exercise
‎{‎
‎    void GetDeposit(decimal amount)‎
‎    {‎
‎        amount = 450;‎
‎        System.Console.WriteLine("In GetDeposit()");‎
‎        System.Console.Write("Amouont: $");‎
‎        System.Console.WriteLine(amount);‎
‎    }‎

‎    static int Main()‎
‎    {‎
‎        decimal amt = 0;‎
‎        var exo = new Exercise();‎
‎        System.Console.WriteLine("In Main()");‎
‎        System.Console.Write("Amouont: $");‎
‎        System.Console.WriteLine(amt);‎
‎        System.Console.WriteLine("-------------------------");‎
‎        exo.GetDeposit(amt);‎
‎        System.Console.WriteLine("-------------------------");‎
‎        System.Console.WriteLine("Bank in Main()");‎
‎        System.Console.Write("Amouont: $");‎
‎        System.Console.WriteLine(amt);‎
‎        return 0;‎
‎    }‎
‎}‎

نتیجه ی زیر حاصل می گردد.

In Main()
Amouont: $0
-------------------------
In GetDeposit()
Amouont: $450
-------------------------
Bank in Main()
Amouont: $0
Press any key to continue...

همان طور که مشاهده می کنید، مقدار آرگومان قبل و پس از فراخوانی متد GetDeposit() یکسان است و هیچ فرقی نمی کند. هنگامی که متغیری را در برنامه ی خود تعریف می کنید، compiler مقداری حافظه به آن تخصیص می دهد. در مورد متغیر دو چیز از اهمیت بالایی برخوردار است : مقدار متغیر و محل قرار گیری آن در حافظه. به مکان یا محل قرارگیری متغیر در حافظه، آدرس متغیر می گویند. اگر آرگومان را با استفاده از اسم فراخوانی کنید، compiler تنها کپی ای از مقدار آرگومان تهیه کرده، سپس آن را به متد فراخوان (calling method) می دهد. اگرچه متد فراخوان مقدار آرگوامان ذکر شده را دریافت می کند و می تواند آن را به هر شکل ممکن به کار برد، اما نمی تواند آن را (برای همیشه) تغییر دهد. در صورت نیاز می توان با فراخوانی متد، مقدار یک آرگومان را تغییر داد (modify). اگر می خواهید متد فراخوان مقدار آرگومان ارائه شده را تغییر داده، سپس مقدار تغییر داده شده (modified) را بازگرداند، باید ارگومان را با استفاده از ارجاع (reference) ارسال کنید. حال، برای ارسال آرگومان با استفاده از ارجاع، حین تعریف متد، باید کلیدواژه ی ref را پیش از نوع داده ی آرگومان تایپ کرد.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    void GetDeposit(ref decimal amount)
    {
    }
}

در متد، می توانید آرگومان را به کار ببرید (یا آن را نادیده بگیرید و مورد استفاده قرار ندهید). هنگام فراخوانی متد، اسم آرگومان را پس از کلیدواژه ی ref به کار ببرید. به مثال زیر توجه کنید.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    void GetDeposit(ref decimal amount)
    {
    }

    static int Main()
    {
        decimal amt = 0;
        var exo = new Exercise();

        System.Console.WriteLine("In Main()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(amt);
        exo.GetDeposit(ref amt);
        System.Console.WriteLine("Bank in Main()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(amt);

        return 0;
    }
}

:نتیجه

In Main()
Amount: $0
Bank in Main()
Amount: $0
Press any key to continue...

دلیل اصلی ارسال آرگومان به وسیله ی ارجاع، این است که به متد اجازه ی تغییر مقدار آرگومان داده شود. برای این منظور، لازم است مقدار آرگومان را در متد تغییر داد.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    void GetDeposit(ref decimal amount)
    {
        amount = 450;
        System.Console.WriteLine("In GetDeposit()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(amount);
    }

    static int Main()
    {
        decimal amt = 0;
        var exo = new Exercise();
        System.Console.WriteLine("In Main()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(amt);
        System.Console.WriteLine("-------------------------");
        exo.GetDeposit(ref amt);
        System.Console.WriteLine("-------------------------");
        System.Console.WriteLine("Bank in Main()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(amt);
        return 0;
    }
}

نتیجه:

In Main()
Amount: $0
-------------------------
In GetDeposit()
Amount: $450
-------------------------
Bank in Main()
Amount: $450
Press any key to continue...

همان طور که در مثال بالا مشاهده کردید، این بار مقدار متغیر پس از فراخوانی تابع تغییر یافته.

می توانید کلیه ی آرگومان ها را به عنوان ارجاع ارسال کنید. این که کدام آرگومان با مقدار ارسال شود و کدام با ارجاع بستگی به این دارد که شما می خواهید متد فراخوانده آرگومان را تغییر دهد یا نه.

دیدیم که (یک) تابع می تواند تنها یک مقدار بازگرداند، زیرا تنها یک کلیدواژه ی return وجود دارد. خوشبختانه، ارجاع (reference) با داشتن قابلیت ارسال چندین آرگومان، به متد اجازه می دهد چندین مقدار بازگرداند.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپیک مثال اجرایی از حالت ارسال پارامتر با ارجاع

  1. فایل Management.cs را به صورت زیر اصلاح کنید.
public class Management
{
    private void ShowAccountInformation(string acntNbr, string name,
                                        short PIN, double balance)
    {
        System.Console.WriteLine("==============================");
        System.Console.WriteLine("Account Information");
        System.Console.WriteLine("------------------------------");
        System.Console.Write("Account #:     ");
        System.Console.WriteLine(acntNbr);
        System.Console.Write("Customer Name: ");
        System.Console.WriteLine(name);
        System.Console.Write("PIN:           ");
        System.Console.WriteLine(PIN);
        System.Console.Write("Balanace:      ");
        System.Console.WriteLine(balance);
        System.Console.WriteLine("==============================");
    }

    private double GetDeposit(ref double amount)
    {
        double deposit = 225.55;
        amount = amount + deposit;
        return deposit;
    }

    private double GetWithdrawal(ref double amount)
    {
        double withdrawal = 265.25d;
        amount = amount - withdrawal;
        return withdrawal;
    }

    public static int Main()
    {
        Management man = new Management();
        string accountNumber  = "248-050842-749";
        string customerName   = "Ann Kelley";
        short  pin = 8648;
        double currentBalance = 350.00D;
        double? depositAmount    = null;
        double? withdrawalAmount = null;

        man.ShowAccountInformation(accountNumber, customerName, 
                                    pin, currentBalance);

        depositAmount = man.GetDeposit(ref currentBalance);

        System.Console.WriteLine("After a new deposit");
        man.ShowAccountInformation(accountNumber, customerName, 
                                    pin, currentBalance);

        withdrawalAmount = man.GetWithdrawal(ref currentBalance);
        System.Console.WriteLine("After a withdrwal");

        man.ShowAccountInformation(accountNumber, customerName, 
                                    pin, currentBalance);

        System.Console.ReadKey();
        return 0;
    }
}
  1. کلید F5 را زده تا برنامه اجرا شود.
==============================
Account Information
------------------------------
Account #:     248-050842-749
Customer Name: Ann Kelley
PIN:           8648
Balanace:      350
==============================
After a new deposit
==============================
Account Information
------------------------------
Account #:     248-050842-749
Customer Name: Ann Kelley
PIN:           8648
Balanace:      575.55
==============================
After a withdrwal
==============================
Account Information
------------------------------
Account #:     248-050842-749
Customer Name: Ann Kelley
PIN:           8648
Balanace:      310.3
==============================
  1. Enter را زده تا پنجره ی DOS بسته شود.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ ارسال آرگومان out

روش دیگر ارسال آرگومان با استفاده از کلیدواژه ی out می باشد. به منظور ارسال آرگومان out، داخل پرانتز متد پیش از نوع داده ی آرگومان کلیدواژه ی out را تایپ می کنیم.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    void GetWithdrawal(out decimal amount)
    {
    }
}

تفاوت اصلی بین کلید واژه های ref و out این است که در صورت ارسال آرگومان با کلید واژه ی out، آرگومان باید حتماً داخل خود متد مقداردهی اولیه شود.

public class Exercise
{
    void GetWithdrawal(out decimal amount)
    {
        amount = 265.00m;
    }
}

هنگام فراخوانی متدی که آرگومان out می گیرد، باید کلید واژه ی out را پیش از آرگومان استفاده کنید. به مثال زیر توجه کنید.

public class Exercise
{
    void GetDeposit(ref decimal amount)
    {
        amount = 450.00M;
        System.Console.WriteLine("In GetDeposit()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(amount);
    }

    void GetWithdrawal(out decimal amount)
    {
        amount = 265.00m;
        System.Console.WriteLine("In GetWithdrawal()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(amount);
    }

    static int Main()
    {
        decimal depositAmount = 0M;
        decimal withdrawalAmount = 0M;
        var exo = new Exercise();
        System.Console.WriteLine("In Main()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(depositAmount);
        System.Console.WriteLine("-------------------------");
        exo.GetDeposit(ref depositAmount);
        System.Console.WriteLine("-------------------------");
        System.Console.WriteLine("Bank in Main()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(depositAmount);
        System.Console.WriteLine("-------------------------");
        exo.GetWithdrawal(out withdrawalAmount);
        System.Console.WriteLine("-------------------------");
        System.Console.WriteLine("Bank in Main()");
        System.Console.Write("Amount: $");
        System.Console.WriteLine(withdrawalAmount);
        return 0;
    }
}

چنانچه آرگومانی را با کلید واژه ی out ارسال کنید، تمام تغییرات وارد آمده بر آرگومان حتی پس از اتمام متد، نگه داشته می شوند.

In Main()
Amount: $0
-------------------------
In GetDeposit()
Amount: $450.00
-------------------------
Bank in Main()
Amount: $450.00
-------------------------
In GetWithdrawal()
Amount: $265.00
-------------------------
Bank in Main()
Amount: $265.00
Press any key to continue...

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپاضافه بارگذاری متد (method overloading)

تابع زیر به نام CalculateArea را در نظر بگیرید.

public class Geometry
{
    double CalculateArea()
    {
        return 0D;
    }
}

هنگامی که متدی در کلاس ایجاد کرده و پروژه ای می سازید، compiler لیستی از آن متدها تهیه می کند. به لیست مزبور virtual table (جدول مجازی) می گویند. در جدول بیان شده، متد با استفاده از اسمش کد گذاری می شود.

Encoding
Method Name
Calculate@None
CalculateArea

در صورتی که متد آرگومانی داشت، جدول بالا نوع داده ی آرگومان را نمایش می دهد. نوع بازگشتی متد و اسم های آرگومان ها هیچ کدام مهم نیستند. در صورتی که کلاس دربردارنده ی متدهایی با اسامی متفاوتی بود، متدها به راحتی از هم قابل تشخیص خواهند بود. گاهی اوقات لازم است متدهای مختلفی داشته باشید که همگی یک کار مشابه را انجام می دهند ولی با تفاوت های جزئی (این دیگر بستگی به شما دارد که این تفاوت ها چه باشند). یکی از گزینه های پیش رو این است که اسم متدها را یکی انتخاب کنید. به قابلیت داشتن چندین متد با اسم مشابه در یک کلاس method overloading می گویند.

برای اجرای method overloading، هنگام ایجاد virtual table، تک تک درایه ها (entry) در لیست نام برده باید منحصر به فرد باشند. همان طور که پیش تر ذکر شد، نوع بازگشتی متد داخل جدول قرار داده نمی شود، در نتیجه نمی توان تفاوت ها را بر آن اساس پایه گذاری کرد. اگر سعی کنید دو متد ایجاد کنید که هیچ یک آرگومان نمی گیرند، طبیعتاً تشخیص آن دو متد از یک دیگر ممکن نخواهد بود. راه حل مسئله بالا این است که حداقل یکی از آن دو متد آرگومان بگیرند. به مثال زیر توجه کنید.

public class Geometry
{
    // Unknown Shape
    public double CalculateArea()
    {
        return 0D;
    }

    // Square
    public double CalculateArea(double side)
    {
        return side * side;
    }
}
Encoding
Argument(s)
Method Name
Calculate@None
 
CalculateArea
Calculate@Double
Double
CalculateArea

همان طور که انتظار می رفت، این بار هر متد رمزگذاری (encoding) جداگانه ای (متفاوتی) دارد. مثال زیر کد بالا را به کار می برد.

public class Geometry
{
    // Unknown Shape
    public double CalculateArea()
    {
        return 0D;
    }

    // Square
    public double CalculateArea(double side)
    {
        return side * side;
    }
}

public class Exercise
{
    static int Main()
    {
        Geometry geo = new Geometry();
        System.Console.WriteLine("Geometric Shapes");
        System.Console.WriteLine("Calculation of Areas");
        System.Console.Write("Square: ");
        System.Console.WriteLine(geo.CalculateArea(26.38));
        return 0;
    }
}

نتیجه ی زیر به دست می آید.

Geometric Shapes
Calculation of Areas
Square: 695.9044
Press any key to continue...

به خاطر داشته باشید که اسم یک آرگومان بخشی از رمزگذاری (encoding) آن در virtual table محسوب نمی شود. بنابراین، نمی توان دو متد به کاربرد که هر دو یک آرگومان یکسان داشته باشد. کد زیر را در نظر بگیرید.

public class Geometry
{
    // Unknown Shape
    public double CalculateArea()
    {
        return 0D;
    }

    // Square
    public double CalculateArea(double side)
    {
        return side * side;
    }

    // Circle
    public double CalculateArea(double radius)
    {
        return radius * radius * 3.14159;
    }
}

عملیات بالا نتیجه ی زیر را به دست می دهد.

Encoding
Argument(s)
Method Name
Calculate@None
 
CalculateArea
Calculate@Double
Double
CalculateArea
Calculate@Double
Double
CalculateArea

در نتیجه، زمانی که پروژه را به وجود می آورید، compiler پیغام خطای زیر را تولید می کند.

Error 1 Type 'Geometry' already defines a member called 'CalculateArea' 
with the same parameter types
C:\Exercise1\Exercise.cs   16   19   Overloading

یکی از قواعد اضافه بار گذاری متد این است که متد گفته شده می تواند آرگومان هایی از نوع مختلف داشته باشد. به مثال زیر توجه کنید.

public class Geometry
{
    // Unknown Shape
    public double CalculateArea()
    {
        return 0D;
    }

    // Square
    public double CalculateArea(double side)
    {
        return side * side;
    }

    // Circle
    public float CalculateArea(float radius)
    {
        return radius * radius * 3.14159f;
    }
}

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ ارسال آرگومان ها به متد یک کلاس ( قسمت دوم)

در بیشتر موارد، شما به دلایلی نمی خواهید آرگومان متفاوتی (از نوع دیگر) ارسال کنید. گفتیم که نوع داده ی آرگومان در داخل virtual table قرار می گیرد. اما اگر هر متد شمار متفاوتی آرگومان بگیرد چه می شود؟ مثال زیر را در نظر بگیرید.

public class Geometry
{
    // Unknown Shape
    public double CalculateArea()
    {
        return 0D;
    }

    // Square
    public double CalculateArea(double side)
    {
        return side * side;
    }

    // Rectangle
    public double CalculateArea(double length, double height)
    {
        return length * height;
    }
}

نتیجه ی زیر را به دست می دهد.

Encoding
Argument(s)
Method Name
Calculate@None
 
CalculateArea
Calculate@Double
Double
CalculateArea
Calculate@Double
Double
CalculateArea
Calculate@Double@Double
double، double
CalculateArea

همان طور که در جدول بالا مشاهده می کنید، رمزگذاری (encoding) متد دوم و سوم متفاوت هستند. نمونه ای از فراخوانی متدها را در مثال زیر مشاهده می کنید.

public class Geometry
{
    // Unknown Shape
    public double CalculateArea()
    {
        return 0D;
    }

    // Square
    public double CalculateArea(double side)
    {
        return side * side;
    }

    // Rectangle
    public double CalculateArea(double length, double height)
    {
        return length * height;
    }
}

public class Exercise
{ 
    static int Main()
    {
        var geo = new Geometry();  
        System.Console.WriteLine("Geometric Shapes");
        System.Console.WriteLine("Calculation of Areas");
        System.Console.Write("Square:    ");
        System.Console.WriteLine(geo.CalculateArea(26.38));
        System.Console.Write("Rectangle: ");
        System.Console.WriteLine(geo.CalculateArea(39.17, 26.38));

        return 0;
    }
}

نتیجه

Geometric Shapes
Calculation of Areas
Square:    695.9044
Rectangle: 1033.3046
Press any key to continue...

اگرچه در مثال بالا از دو آرگومان نوع دابل (double argument) برای متد سوم استفاده کردیم، آرگومان می تواند از هر نوعی باشد. این تصمیم دیگر با شما است که چی متد را به وجود آورد. بنابراین، قاعده ی دیگر اضافه بارگذاری متد ایجاب می کند هر متد آرگومان های متفاوتی داشته باشد.

یکی از خصوصیات بیشتر زبان های برنامه نویسی کامپیوتر از جمله زبان های مبنای C، C++، Java، C#و دیگر زبان ها مثل : Pascal، Visual Basic این است که برنامه نویس نیازی به استفاده از آرگومان داخل متد ندارد. از این امکان می توان برای ایجاد دو نسخه ی کاملاً متفاوت متد استفاده کرد که هر دو عملکرد (behavior) مشابه دارند : می توان آرگومانی ارسال کرد که در آینده مورد استفاده قرار نمی گیرد ولی منجر به ایجاد درایه ی جدید و متمایز در virtual table می شود. کد زیر را در نظر بگیرید.

public class Geometry
{
    // Unknown Shape
    public double CalculateArea()
    {
        return 0D;
    }

    // Square
    public double CalculateArea(double side)
    {
        return side * side;
    }

    // Rectangle
    public double CalculateArea(double length، double height)
    {
        return length * height;
    }

    // Circle
    public double CalculateArea(double radius، int unused)
    {
        return radius * radius * 3.14159;
    }
}

نتیجه ی زیر حاصل می گردد.

Encoding
Argument(s)
Method Name
Calculate@None
 
CalculateArea
Calculate@Double
Double
CalculateArea
Calculate@Double
Double
CalculateArea
Calculate@Double@Double
double، double
CalculateArea
Calculate@Double@Double
double، double
CalculateArea

همان طور که مشاهده می کنید رمز گذاری ها متمایز هستند.

به خاطر دارید که برای محاسبه ی محیط های یک مربع یا دایره، به تنها یک مقدار (value) نیاز دارید. به منظور تمیز دادن / وجه تمایز قائل شدن بین محاسبات این دو محیط در کد، آرگومانی متفاوت (دومی) به محیط دایره ارسال می کردیم. ما در مثال خود آرگومان را "unused" نامیدیم، ولی شما می توانید هر اسمی که دوست دارید برای آن انتخاب کنید (یکی از تفاوت های بین زبان های C++ و C# این است که در C++ می توان اسم آرگومان را حذف کرد. بنابراین، اگر کد بالا را با زبان C++ می نوشتیم دیگر نیازی به نام گذاری آرگومان وجود نداشت).

هنگام فراخوانی متدی که دو آرگومان می گیرد، توجه داشته باشید که حتماً باید مقداری به آرگومان دومی ارسال شود. به این خاطر که متد آرگومان گفته شده را به کار نمی برد، فرقی نمی کند چه مقداری به آن ارسال کنید، مادام این که با نوع متد هم خوانی و مطابقت داشته باشد.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Geometry
{
    // Unknown Shape
    public double CalculateArea()
    {
        return 0D;
    }

    // Square
    public double CalculateArea(double side)
    {
        return side * side;
    }

    // Rectangle
    public double CalculateArea(double length، double height)
    {
        return length * height;
    }

    // Circle
    public double CalculateArea(double radius، int unused)
    {
        return radius * radius * 3.14159;
    }
}

public class Exercise
{
    static int Main()
    {
        var geo = new Geometry();
        System.Console.WriteLine("Geometric Shapes");
        System.Console.WriteLine("Calculation of Areas");
        System.Console.Write("Square:    ");
        System.Console.WriteLine(geo.CalculateArea(26.38));
        System.Console.Write("Rectangle: ");
        System.Console.WriteLine(geo.CalculateArea(39.17، 26.38));
        System.Console.Write("Circle:    ");
        System.Console.WriteLine(geo.CalculateArea(26.38، 0));
        return 0;
    }
}

نتیجه

Geometric Shapes
Calculation of Areas
Square:    695.9044
Rectangle: 1033.3046
Circle:    2186.246303996
Press any key to continue...

اضافه بارگذاری متد در .NET Framework کاربرد فراوانی دارد. بنابراین، لازم است قواعد آن را هنگام استفاده از این برنامه به خاطر داشته باشید. خوشبختانه این قواعد بسیار ساده هستند : متدها یا باید شمار متفاوت / تعداد مختلفی آرگومان داشته باشند و یا آرگومان های آن ها از نوع متفاوت باشند (نوع آرگومان های ارسال شده به آن ها از هم متمایز باشند). هنگامی که متدی overload می شود، در code editor، IntelliSense برچسبی 1 از x نمایش می دهد. x نشانگر تعداد نسخه های متد می باشد. در زیر تابعی (function) مشاهده می کنید که سه نسخه ی مجزا دارد، بنابراین IntelliSense 1 از 3 را نمایش می دهد.

آموزش آرگومان ها درC#

برای انتخاب یکی از ورژن ها، می توان کلید پیکان جهت پایین (down arrow key) را فشار داد یا مقدار آرگومان مورد نظر را تایپ کرده تا برنامه، نسخه ی مورد نظر را نمایش دهد.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپآرگومان های اختیاری

گفته شد در صورتی که متدی آرگومان گرفت، هنگام فراخوانی آن آرگومان، لازم است مقداری برای آرگومان نام برده فراهم کرد. البته، استثنایی برای قاعده ی مذکور وجود دارد. چنانچه متدی دارید که آرگومان آن معمولاً مقداری یکسان دریافت می کند، می توانید مقداری پیش فرض به آرگومان مزبور اختصاص دهید. کد زیر را در نظر بگیرید.

public class Exercise
{
    double? CalculateNetPrice(double? discountRate)
    {
        double? origPrice = 125.55;
        return origPrice - (origPrice * discountRate / 100);
    }

    static int Main()
    {
        var exo = new Exercise();
        double? finalPrice = null;
        double? discount = 15; // That is 25% = 25
            finalPrice = exo.CalculateNetPrice(discount);
        System.Console.WriteLine("After applying the discount");
        System.Console.Write("Final Price = ");
        System.Console.WriteLine(finalPrice);
        return 0;
    }
}

نتیجه

After applying the discount
Final Price = 106.7175
Press any key to continue...

برای نشان دادن این که آرگومانی مقدار پیش فرض دارد، مقدار پیش فرض را داخل پرانتز متد، پس از اسم آرگومان قرار دهید.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    double? CalculateNetPrice(double? discountRate = 25)
    {
        double? origPrice = 125.55;
        return origPrice - (origPrice * discountRate / 100);
    }
}

می توان هنگام فراخوانی متد، یک مقدار به آرگومان ارسال کرد. چنانچه می خواهید مقدار پیش فرض را به کارببرید، دیگر نیازی به ارسال آرگومان نیست.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    double? CalculateNetPrice(double? discountRate = 25)
    {
        double? origPrice = 125.55;
        return origPrice - (origPrice * discountRate / 100);
    }

    static int Main()
    {
        var exo = new Exercise();
        double? finalPrice = null;
        finalPrice = exo.CalculateNetPrice();
        System.Console.WriteLine("After applying the discount");
        System.Console.Write("Final Price = ");
        System.Console.WriteLine(finalPrice);
        return 0;
    }
}

توجه داشته باشید که پرانتزهای متد خالی هستند، به این معنی که آرگومانی ارسال نشده است. نتیجه ی زیر به دست می آید.

After applying the discount
Final Price = 94.1625
Press any key to continue...

به همین ترتیب، می توان متدی ایجاد کرد که آرگومان های متعددی می گیرد. حال، کلیه ی آرگومان های مزبور (یا برخی از آن ها) می توانند مقدارهای پیش فرض داشته باشند. در صورتی که متدی چند آرگومان (بیش از یک آرگومان) گرفت، می توان آرگومانی پیش فرض برای هر یک فراهم کرد، سپس انتخاب کرد کدام یک از آرگومان ها مقدار پیش فرض دریافت کنند. اگر می خواهید کلیه ی آرگومان ها مقدار پیش فرض داشته باشند، حین تعریف متد مورد نظر، به دنبال هر اسم علامت مساوی " = " و مقدار دلخواه را تایپ کنید. توجه خود را به مثال زیر جلب کنید.

public class Exercise
{
    double? CalculateNetPrice(double? tax = 5.75,
                                double? discount = 25,
                                double? origPrice = 245.55)
    {
        double? discountValue = origPrice * discount / 100;
        double? taxValue = tax / 100;
        double? netPrice = origPrice - discountValue + taxValue;
        System.Console.Write("Original Price: $");
        System.Console.WriteLine(origPrice);
        System.Console.Write("Discount Rate: ");
        System.Console.Write(discount);
        System.Console.WriteLine("%");
        System.Console.Write("Tax Amount: $");
        System.Console.WriteLine(tax);
        return netPrice;
    }

    static int Main()
    {
        var exo = new Exercise();
        double? finalPrice = null;
        finalPrice = exo.CalculateNetPrice();
        System.Console.WriteLine("After applying the discount");
        System.Console.Write("Final Price = ");
        System.Console.WriteLine(finalPrice);
        return 0;
    }
}

نتیجه

Original Price: $245.55
Discount Rate: 25%
Tax Amount: $5.75
After applying the discount
Final Price = 184.22
Press any key to continue...

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ ارسال آرگومان ها به متد یک کلاس ( قسمت سوم )

چنانچه متدی چند آرگومان (بیش از یک آرگومان) گرفت، و شما خواستید مقدارهای پیش فرضی برای آن پارامترها فراهم کنید، ترتیب قرار گیری آرگومان ها از اهمیت خاصی برخوردار خواهد بود.

اگر متد دو آرگومان داشت، می توان آن را با مقادیر پیش فرض تعریف کرد. چنانچه می خواهید مقداری پیش فرض برای تنها یکی از آرگومان ها ارائه دهید، آن مقدار پیش فرض فقط به آرگومان دومی تعلق می گیرد. هنگام فراخوانی چنین تابعی، چنانچه تنها یک آرگومان فراهم کنید، compiler مقدار آن را به اولین پارامتر در لیست تخصیص می دهد و هیچ مقداری به دومین پارامتر اختصاص نمی دهد.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    double? CalculateNetPrice(double? taxRate, double? discountRate = 25)
    {
        double? origPrice = 185.95;
        double? discountValue = origPrice * discountRate / 100;
        double? taxValue = taxRate / 100;
        double? netPrice = origPrice - discountValue + taxValue;
        return netPrice;
    }

    static int Main()
    {
        double? finalPrice;
        double? taxRate = 5.50; // = 5.50%
        Exercise exo = new Exercise();
        finalPrice = exo.CalculateNetPrice(taxRate);
        System.Console.WriteLine("After applying a 25% discount and a 5.50% tax rate");
        System.Console.Write("Final Price = ");
        System.Console.WriteLine(finalPrice);
        return 0;
    }
}

نتیجه

After applying a 25% discount and a 5.50% tax rate
Final Price = 139.5175
Press any key to continue...

چنانچه پس از تعریف تابع و تخصیص مقدار پیش فرض به اولین آرگومان، تنها یک آرگومان هنگام فراخوانی تابع فراهم کنید، با پیغام خطا مواجه می شوید. کد زیر را در نظر بگیرید.

public class Exercise
{
    double? CalculateNetPrice(double? discountRate = 25, double? taxRate)
    {
        double? origPrice = 185.95;
        double? discountValue = origPrice * discountRate / 100;
        double? taxValue = taxRate / 100;
        double? netPrice = origPrice - discountValue + taxValue;
        return netPrice;
    }

    static int Main()
    {
        double? finalPrice;
        double? taxRate = 5.50; // = 5.50%
        Exercise exo = new Exercise();
        finalPrice = exo.CalculateNetPrice(taxRate);
        System.Console.WriteLine("After applying a 25% discount and a 5.50% tax rate");
        System.Console.Write("Final Price = ");
        System.Console.WriteLine(finalPrice);
        return 0;
    }
}

دو پیغام خطای زیر صادر می شوند.

Error 1 Optional parameters must appear after all required parameters
C:\Exercises\Bank\Exercise.cs  3    70   Bank

حال، چنانچه متد چندین آرگومان (بیش از دو آرگومان) دریافت کرد و می خواهید که تنها تعدادی از آن آرگومان ها مقدار پیش فرض داشته باشند، به خاطر داشته باشید که آرگومان های با مقدار پیش فرض باید انتهای لیست قرار بگیرند. صرف نظر از این که چه تعداد آرگومان مقدار پیش فرض دریافت می کنند (و چه تعداد مقدار پیش فرض دریافت نمی کنند)، همیشه لیست خود را با آرگومان هایی آغاز کنید که مقدار پیش فرض به کار نمی گیرند.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    double? CalculateNetPrice(double? origPrice,
                                double? taxRate = 5.75,
                                double? discountRate = 25)
    {
        double? discountValue = origPrice * discountRate / 100;
        double? taxValue = taxRate / 100;
        double? netPrice = origPrice - discountValue + taxValue;
        return netPrice;
    }
}
    

در هنگام فراخوانی متد، به یاد داشته باشید که تنها برای آرگومان هایی که مقدار پیش فرض ندارند می توان مقدار ارائه داد.

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    double? CalculateNetPrice(double? origPrice,
                                double? taxRate = 5.75,
                                double? discountRate = 25)
    {
        double? discountValue = origPrice * discountRate / 100;
        double? taxValue = taxRate / 100;
        double? netPrice = origPrice - discountValue + taxValue;
        return netPrice;
    }

    static int Main()
    {
        double? originalPrice = 375.95;
        double? finalPrice;
        Exercise exo = new Exercise();
        finalPrice = exo.CalculateNetPrice(originalPrice);
        System.Console.WriteLine("After applying a 25% discount and a 5.75% tax rate");
        System.Console.Write("Final Price = ");
        System.Console.WriteLine(finalPrice);
        return 0;
    }
}
After applying a 25% discount and a 5.75% tax rate
Final Price = 282.02
Press any key to continue...

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ فراخوانی آرگومان با (استفاده از) اسم

تصور کنید متدی دارید که چندین آرگومان اختیاری می گیرد. در C++، برای تخصیص مقدار به دومین آرگومان اختیاری، ابتدا باید مقداری برای اولین آرگومان اختیاری ارسال کنید. حتی اگر هم بخواهید مقدار پیش فرض آرگومان اولی را به کارببرید، باید آن را ارسال کنید. به مثال زیر توجه کنید.

public class Exercise
{
    double? CalculateNetPrice(double? origPrice,
                                double? taxRate = 5.75,
                                double? discountRate = 25)
    {
        double? discountValue = origPrice * discountRate / 100;
        double? taxValue = taxRate / 100;
        double? netPrice = origPrice - discountValue + taxValue;
        return netPrice;
    }

    static int Main()
    {
        double? finalPrice;
        Exercise exo = new Exercise();
        finalPrice = exo.CalculateNetPrice(375.95, 5.75, 40);
        System.Console.WriteLine("Original Price: 375.95");
        System.Console.WriteLine("Tax Rate:       5.75%");
        System.Console.WriteLine("Discount Rate:  40%");
        System.Console.Write("Final Price:    ");
        System.Console.WriteLine(finalPrice);
        return 0;
    }
}

نتیجه ی زیر حاصل می گردد.

Original Price: 375.95
Tax Rate:       5.75%
Discount Rate:  40%
Final Price:    225.6275
Press any key to continue...

تصور کنید می خواهید یک آرگومان اختیاری را نادیده گرفته تا از مقدار پیش فرض آن استفاده کنید، ولی برای آرگومان های دوم، سوم.. می خواهید مقدار ارسال کنید. برای این منظور، در پرانتز متدی که فرا می خوانید، اسم آرگومان مورد نظر و به دنبال آن دو نقطه (:) و مقدار دلخواه را تایپ کنید ( که در واقع با پروسه ی فراخوانی متد با استفاده از اسم یکی است).

آموزش سی شارپ - آموزش ارسال پارامتر به متد یک کلاس در سی شارپ مثال:

public class Exercise
{
    double? CalculateNetPrice(double? origPrice,
                                double? taxRate = 5.75,
                                double? discountRate = 25)
    {
        double? discountValue = origPrice * discountRate / 100;
        double? taxValue = taxRate / 100;
        double? netPrice = origPrice - discountValue + taxValue;
        return netPrice;
    }

    static int Main()
    {
        double? finalPrice;
        Exercise exo = new Exercise();
        finalPrice = exo.CalculateNetPrice(discountRate : 40, origPrice : 375.95);
        System.Console.WriteLine("Original Price: 375.95");
        System.Console.WriteLine("Tax Rate:       5.75%");
        System.Console.WriteLine("Discount Rate:  40%");
        System.Console.Write("Final Price:    ");
        System.Console.WriteLine(finalPrice);
        return 0;
    }
}

با استفاده از این روش، می توان آرگومان های اختیاری را که حاضر نیستید مقداری برای آن ها فراهم کنید نادیده گرفت.

  • 3584
  •    2062
  • تاریخ ارسال :   1394/07/27

دانلود PDF دانلود سورس کد دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .