درک متدهای Extension در Net.

یکشنبه 25 تیر 1396

اکستنشن متد ها یکی از بهترین ویژگی های Net. است که به توسعه دهندگان اجازه میدهد یک متد را افزوده یا متدهایی از نوع موجود یا کلاس هایی که به طورطبیعی آن ها را فراخوانی می کنند گسترش دهند به شرط اینکه آن ها جزو این نوع یا کلاس باشند.

درک متدهای Extension  در Net.

آیا میدانستید که میتوانید عملکرد (functionality) هر کلاس یا نوعی را درNET Framework. یا هر کتابخانه خارجی دیگر بدون داشتن سورس آن

می توانید گسترش دهید؟

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

همین امر در مورد کلاس های خود نیز صادق است.

این قدرت اکستنشن متدهای NET. است.

اکستنشن متدها یکی از بهترین و مفیدترین ویژگی است که از Net. 3 به بعد اضافه شد ، که به توسعه دهندگان توانایی افزودن و گسترش دادن متد هایی از نوع موجود را بدون ایجاد کردن نوع جدید مشتق شده ویرایش یا اصلاح میکند.

زمانیکه شما یک اکستنشن متد مینویسید ، شما میتوانید از آن مانند یک متد موجود نمونه سازی کنید.

در این مقاله ما قصد داریم که اکستنشن متد را با بیان یک مثال در #C توضیح بدهیم و روش پیاده سازی این را در کد نشان بدهیم و سپس اکستنشن متد را با generic ها برای نمایش استفاده نهایی از چنین ویژگی های قابل توسعه ای در Net. ترکیب کنیم.ما همچنین نگاهی به کتابخانه های اوپن سورس اکستنشن متد های موجود بر روی وب می اندازیم.

ساختار اکستنشن متد

1)اکستنشن متد باید در یک کلاس static تعریف شود.

2)اکستنشن متد میتواند نوع برگشتی داشته یا نداشته باشد.

3)اکستنشن متد باید شامل حداقل یک ارگومان باشد که نوع آن باید یکسان با کلاسی که گسترش داده است باشد(به عنوان مثال اگر شما در حال نوشتن یک اکستنشن متد از نوع String هستید، اولین پارامتر در آن متد گسترش باید از نوع String باشد) و باید با این کلمه کلیدی شروع شود.

4)برای استفاده از اکستنشن متد شما باید فضای نامی را که اکستنشن متد در آن تعریف شده است وارد کنید.

5)شما میتوانید از اکستنشن متد برای overload  کردن متد های موجود استفاده کنید.

6)اکسپشن متد ها نوع های generic  را قبول میکنند.

دو نکته مهم راجع به اکستنشن متد ها وجود دارد:

1)شما نمیتوانید اکستنشن پراپرتی ، فیلد یا رویداد تعریف کنید.

2)اکستنشن متدها نمیتوانند در override کردن اکستنشن متد ها استفاده شوند.

مثال اکستنشن متد در #C

برای نشان دادن ویژگی های بیشتر اکستنشن متد در Net. یک مثال ساده برای اکستنشن متد که میتواند با شی string مورد استفاده قرار گیرد ، بیان میکنیم.این اکستنشن متد Reverse string است.به کد های زیر دقت کنید:

using System.Linq;

namespace Extensions
{
    public static class StringExtensions
    {
        public static string Reverse(this string input)
        {
            if (string.IsNullOrEmpty(input)) return "";
            return new string(input.ToCharArray().Reverse().ToArray());
        }
    }
}

و سپس ، شما این متد را مانند زیر فراخوانی میکنید:

var input = "coding";
var inputReversed = input.Reverse();
MessageBox.Show(inputReversed);

پس اجرای کد بالا مقدار 'gnidoc' به عنوان مقدار برعکس شده متن 'coding' در خروجی نمایش داده می شود.

توجه)هر گاه که قصد استفاده از اکستنشن متد را داشتید به این نکته که باید فضای نام ان را در صفحه معرفی کنید توجه داشته باشید.در این مورد ما نام ان را "Extensions" میگذاریم.ولی شما میتوانید نام مورد نظر خودتان را بر روی آن بگذارید:

اکستنشن متد ها و جنریک ها

همانطور که قبلا ذکر شد، یک اکستنشن متد را می توان برای گسترش کلاس های generic  یا نوع داده (از نوع T) تعریف کرد، شما میتوانید براحتی یک اکستنشن متد که نوع generic را قبول کند بنویسید.به کد های زیر دقت کنید:

public static bool IsNullOrEmpty<T>(this IEnumerable<T> Source)
{
    if (Source == null) return true;

    ICollection<T> collection = (ICollection<T>)Source;

    if (collection != null) return collection.Count < 1;

    return !Source.Any();
}

متد بالا ،  generic collection ارائه شده را که اینترفیس IEnumerable را پیاده سازی کرده است مورد بررسی قرار خواهد داد که دریابد null است یا خالی ، که این میتواند زمانیکه شما تعداد زیادی از collections object از نوع (generic (T دارید و نمیدانید که کدام یک از آن ها null یا خالی است مفید باشد ، بنابریان به جای آن که collection == null || collection.size == 0 را چک کنید یک اکستنشن متد مینویسید و آن این کار را برای شما انجام میدهد.

کدهای زیر نحوه استفاده از این متد را نشان میدهند:

List<int> someList = null;
if (someList.IsNullOrEmpty())
{
    MessageBox.Show("Empty list");
}

در نگاه اول ، شما ممکن است فکر کنید کد های بالا یک خطا از نوع null پرتاب کنند ، چون ما سعی داریم که  به یک متد که در یک شی با مرجع null است دسترسی پیدا کنیم ، به هر حال ، کامپایلر Net. تعیین خواهد کرد که این یک اکستنشن متد است و “Empty List” را به عنوان خروجی در message box نمایش خواهد داد.

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

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

کتابخانه های اوپن سورس برای اکستنشن متدهای Net.

طیف گسترده ای از صدها اکستنشن متد مفید و اماده Net. توسط انجمن NET. از طریق CodePlex ارائه شده است.

همین امروز میتوانید از ان ها استفاده کنید ، فقط رفرنس کتابخانه ان ها را از طریق http://dnpextensions.codeplex.com اضافه کنید.

یا حتی میتوانید این کتابخانه را از NuGet و http://nuget.org/packages/PGK.Extensions/  دریافت کنید و بلافاصله بدون نیاز به import کردن از ان استفاده کنید.

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید