اخبار، مطالب و رویدادهای مرتبط با توسعه نرم افزار رادکام

برنامه نویسی پیشرفته سی شارپ برای پروژه های سی شارپ دات نت - فصل اول: Delegate ها و Event ها - بخش پنجم: ارسال Delegate به عنوان پارامتر در متد

ما می توانیم delegate را به عنوان یک پارامتر به یک متد ارسال(پاس) کنیم. به یک مثال توجه می کنیم.

void ShowString(string value, DisplayDelegate dispStr)
{
	dispStr(value);
}
ShowString("Hello" , displayString);
در اینجا ما متد ShowString را فراخوانی می کنیم. این متد دو پارامتر دارد که اولی از نوع string است که اینجا عبارت "Hello" است و پارامتر دوم نیز از نوع delegate است که displayString نام دارد.
بدنه متد ShowString نیز را هم که مشاهده می کنید، دو پارامتر دارد که اولی از نوع string و دومی نیز که گفتیم از نوع DisplayDelegate است که یک Delegate می باشد. بنابراین ما در اینجا از ارجاع دادن به نوع DisplayDelegate که همان dispStr هست برای فراخوانی متد استفاده می کنیم و مقدار String را به آن ارسال می کنیم. لذا در پاسخ، این فراخوانی متد، متد دیگری را فراخوانی خواهد کرد که در Delegate ای که displayString می باشد کپسوله شده است.

خوب، حال نحوه پیاده سازی موارد گفته شده را در C# می بینیم. مثال ما بدین شکل است که:

using System;
namespace DelegatesAndEvents
{
    public delegate string OperationDelegate(string command);

    public class ComputerSystem
    {
        public string StartApplication(string appName)
        {
            Console.Write("Inside ComputerSystem::StartApplication(): {0}\n", appName);
            return "Success";
        }

        public string StopApplication(string appName)
        {
            Console.Write("Inside ComputerSystem::StopApplication(): {0}\n", appName);
            return "Success";
        }

        public string InstallSoftware(string appName)
        {
            Console.Write("Inside ComputerSystem::InstallSoftware(): {0}\n", appName);
            return "Success";
        }

        public string UnInstallSoftware(string appName)
        {
            Console.Write("Inside ComputerSystem::UnInstallSoftware(): {0}\n", appName);
            return "Success";
        }

        public void Operation(string name, OperationDelegate oprDelegate)
        {
            Console.WriteLine("Result = {0}", oprDelegate(name));
        }
    }
}
ما اینجا OperationDelegate را داریم که یک پارامتر از نوع string می گیرد و مقدار بازگشتی آن نیز از نوع string است.

ما کلاس CompterSystem را داریم که متد های زیر را دارد:

StartApplication
StopApplication
InstallSoftware
UnInstallSoftware
این چهار متد ساختار مشابهی مانند Delegate دارند. بدین معنی که هر 4 تا یک پارامتر ورودی از نوع string داشته و پارامتر خروجی آنها نیز از نوع string است. بنابراین Delegate می تواند به هر 4 تای این متد ها اشاره کند.
ما متد دیگری به نام Operation داریم که دو پارامتر ورودی دارد که اولی از نوع string بوده و دومی نیز از نوع OperationDelegate است و نوع خروجی آن void است.
به سراغ کلاس Program.cs می رویم.

// See https://aka.ms/new-console-template for more information
using DelegatesAndEvents;

Console.WriteLine("Hello, World!");
Console.WriteLine("______________________________________________");
Console.WriteLine("");

ComputerSystem compsysObj = new ComputerSystem();

//User of delegate
OperationDelegate oprDelegate = new OperationDelegate(compsysObj.InstallSoftware);
Console.WriteLine("Result = {0}", oprDelegate("My Application"));

oprDelegate = new OperationDelegate(compsysObj.StartApplication);
Console.WriteLine("Result = {0}", oprDelegate("My Application"));

oprDelegate = new OperationDelegate(compsysObj.StopApplication);
Console.WriteLine("Result = {0}", oprDelegate("My Application"));

oprDelegate = new OperationDelegate(compsysObj.UnInstallSoftware);
Console.WriteLine("Result = {0}", oprDelegate("My Application"));

Console.WriteLine("");
Console.WriteLine("______________________________________________");
Console.WriteLine("");

//Passing delegate in method
oprDelegate = new OperationDelegate(compsysObj.StartApplication);
Console.WriteLine("Passing delegate in method");
compsysObj.Operation("MyApplication", oprDelegate);

Console.ReadKey();
در اینجا در خطوط بالا، ما یک نمونه از OperationDelegate به نام oprDelegate ایجاد کرده و متد InstallSoftware را کپسوله کرده ایم و سپس از همین oprDelegate استفاده می کنیم و مقدار رشته ای My Application را به آن پاس می دهیم. و این کار باعث فراخوانی متد InstallSoftware می شود.
سپس همین کار را برای کپسوله کردن StartApplication و فراخوانی آن و سپس برای کپسوله کردن StopApplication و فراخوانی آن و سپس برای کپسوله کردن متد UnInstallSoftware و فراخوانی آن انجام می دهیم، این فراخوانی با استفاده از نمونه ایجاد شده oprdelegate انجام می شود.

حال به سراغ سه سطر آخر می رویم که ببینیم چگونه می توان delegate را به عنوان پارامتر ورودی به یک متد پاس کرد.
در اینجا ما متد StartApplication را کپسوله کرده ایم. و سپس متد Operation را فراخوانی می کنیم. پارامتر اول یک رشته با مقدار "My Application" بوده و پارامتر دوم نیز که نمونه ایجاد شده از Delegate به نام oprDelegate است. یعنی ما نمونه ایجاد شده از Delegate را به عنوان پارامتر پاس می دهیم.

همانطور که در بدنه متد Operation می بینیم :

public void Operation(string name, OperationDelegate oprDelegate)
{
      Console.WriteLine("Result = {0}", oprDelegate(name));
}
پارامتر دوم این متد از نوع OperationDelegate است. بنابراین نمونه ایجاد شده delegate که به متد پاس شده است،
compsysObj.Operation("My Application", oprDelegate);
وارد متد Operation شده و آنجا هم که از oprDelegate استاده می کنیم تا متد StartApplication را فراخوانی کنیم. و همانطور که گفتیم، oprDelegate متد StartApplication را کپسوله کرده است و همین متد StartApplication فراخوانی خواهد شد.

پس وارد متد زیر می شویم:

public string StartApplication(string appName)
{
      Console.Write("Inside ComputerSystem::StartApplication(): {0}\n", appName);
      return "Success";
}

که عبارت رشته ای " Inside ComputerSystem::StartApplication(): My Application" را نمایش داده و عبارت " Success " را در خروجی نمایش خواهد داد:

Inside ComputerSystem::StartApplication(): My Application
Result = Success
حال برنامه را اجرا کرده و خروجی را به شکل زیر مشاهده می کنیم:
 C Delegates and Events - Passing delegate in method-OutPut
بنابراین می بینیم که ما اینجا از oprDelegate استفاده کرده و مقدار رشته ای "My Application" را به آن پاس می دهیم. و خروجی ایجاد شده را هم دیدیم.
بنابراین در این مثال Delegate را به عنوان پارامتر به یک متد پاس دادیم.

نام را وارد کنید
تعداد کاراکتر باقیمانده: 1000
نظر خود را وارد کنید