استفاده از Delegate

جمعه ۱۱ تیر ۱۴۰۰

92

2

استفاده از Delegate

چرا باید از نماینده در C # استفاده کرد؟

 

Delegate یکی از درست ترین کلمات تفسیر شده توسط توسعه دهندگان در C # است. Delegate به طور گسترده ای در داخل خود .net frame استفاده می شود. بیایید جلوتر برویم و آن س delegال را که هر مصاحبه کننده ای می پرسد ، تجزیه و تحلیل کنیم

هدف

 

این به دستیابی به موارد زیر کمک می کند ،

کپسوله سازی / انتزاع

امنیت

پاسخ به تماس

قابلیت استفاده مجدد

رایج ترین تعریف نماینده ،

 

"Delegate یک کلمه کلیدی در .net است که به عنوان نشانگر عملکرد استفاده می شود" یا

 

"نماینده فقط برای پاسخگویی استفاده می شود"

 

خوب ، هیچ مشکلی با این تعاریف وجود ندارد اما آنها کل تصویر را به شما نمی گویند.

 

مشخصات

 

نماینده دارای چند ویژگی است:

نوع امن را تایپ کنید

در انتساب روش می گیرد

بیایید با یک مثال شروع کنیم ،

 

ابتدا اجازه دهید مدل محصول خود را ایجاد کنیم

 

ما قصد داریم از این مدل استفاده کنیم

using System;  
  
namespace Models  
{  
    public class Products  
    {  
        public string ProductName { get; set; }  
        public int ProductId { get; set; }  
  
    }  
}  

بیایید ایجاد و رابط کنیم

 

روش عمومی برای ایجاد رابط

 

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace BusinessLayer  
{  
    public interface ICustomer<T>  
    {  
        void Process(T products);  
    }  
}

دوم ، این رابط را در کلاس به ارث ببرید

using Models;  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace BusinessLayer  
{  
    public class FrequentCustomer : ICustomer<Products>  
    {  
        public void Process(Products product)  
        {  
            Console.WriteLine($"Product Count : 1");  
            Console.WriteLine("--Product Details--");  
            Console.WriteLine($"Name : {product.ProductName} Product Id : {product.ProductId}");  
        }  
    }  
}  

فرایند روشی است که بعداً توسط ناشناس فراخوانی می شود

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace ServiceCallManager  
{  
    public static class ServiceCaller  
    {  
        public static void Invoke<TService>(Action<TService> action)  
        {  
            Type typ = typeof(TService);  
            TService instance = (TService)Activator.CreateInstance(typ);  
              
            action(instance);  
        }  
    }  
}  

Invoke روشی است که آرگومان نوع Action <TService> را اجرا می کند ، در نوع بازگشت نماینده نماینده NET باطل است.

 

 

 

Why Use Delegate

 

خلاصه را ببینید ، می گوید "کپسوله".

 

اکنون همه می دانیم که نماینده در انتساب از روش استفاده می کند (روش Encapslates)

 

روش می تواند به هر شکلی باشد ، بگذارید بگوییم روش های ناشناس.

 

روش ناشناس چیست؟

 

"روشی بدون نام!"

 

حالا بیایید کلاس بعدی خود را بررسی کنیم.

class Program  
{  
    static void Main(string[] args)  
    {  
          
        IList<Products> products = new List<Products>();  
  
        Products product1 = new Products();  
        product1.ProductName = "Rice";  
        product1.ProductId = 1;  
        products.Add(product1);  
  
        product1 = new Products();  
        product1.ProductName = "Dal";  
        product1.ProductId = 2;  
        products.Add(product1);  
  
        product1 = new Products();  
        product1.ProductName = "Chana";  
        product1.ProductId = 3;  
        products.Add(product1);  
          
        ServiceCaller.Invoke<FrequentCustomer>(x => x.Process(product1));  
  
        Console.WriteLine();  
        Console.ReadKey();  
    }  
}  
ServiceCaller.Invoke<FrequentCustomer>(x => x.Process(product1));  

بخاطر بسپارید که متد فراخوانی ، نماینده را به عنوان آرگومان می پذیرد و متد را متد جمع می کند ، بنابراین در اینجا در داخل روش Invoke من یک روش ناشناس را می گذرانم که با فراخوانی action () فراخوانی می شود که روش ناشناس را اجرا می کند و متد Process را از کلاس FrequentCustomer فراخوانی می کند.

 

بیایید گام به گام برویم ،

Breakpoint به ServiceCaller می آید. فراخوانی <FrequentCustomer> (x => x.Process (product1)) ؛

این درون روش Invoke کلاس staticServiceCaller قرار دارد

از طریق بازتاب ما در حال ایجاد شی از نوع ServiceT هستیم (اگر از انعکاس متوجه نشوید می توانید این را نادیده بگیرید)

در آخرین خط روش ، عمل با مثال پارامتر فراخوانی می شود. یعنی شی از نوع ServiceT

پس از عمل (نمونه) فراخوانی می شود breakpoint به ServiceCaller می آید. فراخوانی <FrequentCustomer> (x => x.Process (product1)) ؛ و شروع به اجرای قسمت x => x.Process (product1) می کند

مشاهده خواهید کرد که x از نوع FrequentCustomer است


Why Use Delegate

بنابراین این قسمت از اجرا متد Process یا FrequentCustomer را فراخوانی می کند و همچنین پارامتر محلی را در آن عبور می دهد.

اکنون مزیت نماینده در اینجا این است که من قادر به استفاده از متغیر محلی در روش هستم. به عنوان مثال محصول 1 ، که به دلایل امنیتی ممکن است در کلاس دیگر موجود نباشد.

 

Delegate به من کمک می کند Encapsulation ، Security ، Callback (بدیهی است) ، قابلیت استفاده مجدد و در صورت استفاده خردمندانه ، Polymorphism نیز

 

با تشکر از شما برای خواندن