درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
تخفیف های وب سایت
همه تخفیف ها

عضویت در

کانال تلگرام

توسینسو

اطلاعات مطلب
مدرس/نویسنده
حسین احمدی
امتیاز: 215942
رتبه:3
344
265
416
2833
حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ... پروفایل کاربر

آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و هفتم :: قابلیت Generics

تاریخ 37 ماه قبل
نظرات 0
بازدیدها 1801
در ادامه آموزش برنامه نویسی به زبان سی شارپ، با مبحث Generics آشنا خواهیم شد. همزمان با بزرگ تر شدن پروژه ای که در حال کار کردن بر روی آن هستید، باید تکنیک هایی را در کد نویسی استفاده کنید که به شما اجازه استفاده مجدد از کدهای نوشته شده را می دهند. یکی از روش های استفاده مجدد از کدهای موجود در موقعیت های مختلف استفاده از قابلیت Generic ها می باشد. این قابلیت به شما اجازه می دهد تا نوع Data Type فیلد ها، خصوصیات و ... برای کلاس ها را زمان ساختن شئ از روی کلاس مشخص کنید. دوستانی که با زبان ++C آشنا هستند، قابلیت Generics در زبان سی شارپ، معادل قابلیت Template ها در زبان ++C است. قابلیت Generics از نسخه 2 به زبان سی شارپ اضافه شد.

ابتدا بیایید ببینیم دنیای بدون Generic ها در زبان سی شارپ چگونه است؟ فرض کنید کلاسی تعریف می کنیم که یک مقدار از نوع int رو داخل خودش نگهداری می کنه:

public class ValueHolder
{
    public int Value { get; set; }
}

در قدم بعدی میخواهیم کلاس دیگری برای نگهداری مقادیر از نوع string ایجاد کنیم:

public class ValueHolder
{
    public string Value { get; set; }
}

اگر بخواهیم برای هر نوع داده یک کلاس جداگانه ایجاد کنیم، کار جالبی نیست، برای حل این مشکل دو راه حل وجود داره، یکی می توانیم کلاس بالا رو تغییر دهیم و نوع داده خاصیت Value رو از نوع object در نظر بگیریم تا هر مقداری داخلش قرار بگیره:

public class ValueHolder
{
    public object Value { get; set; }
}

اما کد بالا مشکلاتی دارد، یکی اینکه با قرار دادن مقادیر از نوع Value Type داخل خصوصیت Value، عملیات Boxing و زمان خواندن مقدار عملیات UnBoxing رخ میدهد که در قسمت قبل گفتیم این دو عملیات باعث کاهش کارآیی برنامه می شوند. همچنین می توان هر مقداری را داخل Value قرار داد که این موضوع مخالف بحث Type Safety می باشد. برای حل این مشکلات، قابلیت Generics به زبان سی شارپ اضافه شد. مثال بالا رو با Generic ها پیاده سازی می کنیم و سپس توضیحات لازم رو خواهیم داد:

public class ValueHolder<T>
{
    public T Value { get; set; }
}

همانطوری که ملاحظه می کنید، در مقابل نام کلاس در میان <>، کاراکتر T نوشته شده، در حقیقت کاراکتر T در اینجا، بیانگر یک جایگاه برای یک متغیر می باشد که در داخل کلاس، به جای نوع داده بای خصوصیت کاراکتر T نوشته شده، در حقیقت ما در کد بالا گفتیم که کلاس ValueHolder یک جایگاه برای نوع داده در نظر می گیرد که ما نام T را برای آن انتخاب کردیم (انتخاب این نام کاملاً اختیاری است، اما بهتر است هر نامی که انتخاب می شود ابتدای آن با کاراکتر T که مخفف Type است شروع شود)، سپس در داخل کلاس و قسمت هایی که قصد داریم نوع داده را زمان ساخت کلاس مشخص کنیم، به جای خود Data Type، کاراکتر T را می نویسیم که در کد بالا برای خصوصیت Value کاراکتر T نوشته شده. در قدم بعدی می بایست از روی کلاس ValueHolder یک شئ بسازیم، اما ساختن شئ در اینجا با حالت عادی تفاوت دارد، برای ساختن شئ از روی کلاس های Generic به صورت زیر عمل می کنیم:

ValueHolder<int> value = new ValueHolder<int>();
value.Value = 12;

همانطور که مشاهده می کنید، در مقابل نام کلاس در زمان ساخت شئ، داخل <> نام Data Type ای را که می خواهیم جایگزین کاراکتر T شود می نویسیم، در کد بالا، خصوصیت Value از نوع int تعریف می شود. علاوه بر نوع داده int، می توانیم هر نوع داده ای را زمان ساخت شئ مشخص کنیم:

ValueHolder<string> stringHolder = new ValueHolder<string>();
stringHolder.Value = "ITPRO.IR";

دقت کنید، زمانی که نوع T را برای مثال، string در نظر گرفتید، دیگر نمی توانید داخل خصوصیت Value، مقادیری غیر از string قرار دهید، مانند اینکه کلاس ValueHolder نوع داده خصوصیت Value را از نوع string در نظر گرفته است.

شما می توانید علاوه بر یک جایگاه برای نوع داده Generic، چندین جایگاه تعریف کنیم. مثال:

public class MultipleGeneric<T1, T2, T3>
{
    public T1 Value1 { get; set; }
    public T2 Value2 { get; set; }
    public T3 Value3 { get; set; }
}

و زمان ساختن شئ از روی کلاس، به صورت زیر عمل می کنید:

MultipleGeneric<int, string, decimal> values = new MultipleGeneric<int, string, decimal>();
values.Value1 = 12;
values.Value2 = "ITPRO.IR";
values.Value3 = 2.5m;

شما علاوه بر اینکه می توانید کلاس ها را به صورت Generic تعریف کنید، امکان تعریف متدها را نیز به صورت Generic دارید. برای مثال، در کد زیر ما یک متد Generic تعریف کردیم که نوع پارامتر های ورودی در زمان صدا زدن متد مشخص می شوند:

public TOut DoSomething<TOut, TParam1, TParam2>(TParam1 param1, TParam2 param2)
{
    return default(TOut);
}

در کد بالا یه جایگاه TOut و TParam1 و TParam2 در نظر گرفتیم و در تعریف متد از آنها استفاده کردیم. حالا زمان فراخوانی متد به صورت زیر عمل می کنیم:

string result = DoSomething<string, int, int>(12, 20);

اما به یک نکته توجه کنید، در داخل بدنه متد، از کلمه کلیدی default مانند یک متد استفاده شده که داخل پرانتز، نام جایگاه TOut را نوشتیم، کلمه کلیدی TOut، مقدار پیش فرض را برای نوع داده مشخص شده برای جایگاه Generic بر می گرداند. در کد بالا، نوع داده string برای TOut مشخص شده و عبارت default مقدار پیش فرض نوع داده string را بر میگرداند.

برای استفاده از نوع داده generic برای متدها در کلاس ها، می توانید از جایگاه های تعریف شده برای کلاس نیز استفاده بکنید:

public class GenericType<T>
{
    public void DoSomething(T param)
    {
            
    }
}

در کد بالا، همانطور که مشاهده می کنید، برای پارامتر ورودی متد، از جایگاه T که در کلاس تعریف کردیم استفاده کردیم. در این قسمت با مباحث اولیه generic ها آشنا شدیم، در قسمت بعدی یکسری نکات کوچک راجع به generic ها را بررسی کرده، با کلاس List آشنا شده و به بررسی Constraint ها در Generics خواهیم پرداخت. ITPRO باشید و به دیگران هم توصیه کنید که ITPRO باشند.

نویسنده : حسین احمدی
منبع : جزیره برنامه نویسی وب سایت توسینسو
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است
برچسب ها
ردیف عنوان
1 دوره آموزشی .NET Framework و زبان برنامه نویسی سی شارپ - مقدمه
2 آموزش سی شارپ - قسمت اول :: معرفی و بررسی ابزارهای مورد نیاز دوره
3 آموزش زبان سی شارپ - قسمت دوم :: آشنایی با .NET Framework و ساختار آن (بخش اول)
4 آموزش زبان سی شارپ - قسمت دوم :: آشنایی با .NET Framework و ساختار آن (بخش دوم)
5 آموزش زبان سی شارپ - قسمت سوم :: آشنایی اولیه با محیط Visual Studio و نوشتن اولین برنامه
6 آموزش زبان سی شارپ - قسمت چهارم :: آشنایی با ساختار برنامه ها و کامپایلر زبان سی شارپ
7 آموزش زبان سی شارپ - قسمت پنجم :: آشنایی با دستورات کنسول و متغیرها
8 آموزش زبان سی شارپ - قسمت ششم :: نوع های داده اولیه
9 آموزش زبان سی شارپ - قسمت هفتم :: آشنایی با عملگرهای زبان سی شارپ
10 آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش اول)
11 آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش دوم)
12 آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش سوم)
13 آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش چهارم)
14 آموزش زبان سی شارپ - قسمت نهم :: آشنایی با آرایه ها و دستور foreach
15 آموزش زبان سی شارپ - قسمت دهم :: آشنایی با متدها در زبان سی شارپ (بخش اول)
16 آموزش زبان سی شارپ - قسمت دهم :: آشنایی با متدها در زبان سی شارپ (بخش دوم)
17 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت یازدهم :: مقدمه ای بر برنامه نویسی شئ گرا
18 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت دوازدهم :: آشنایی با کلاس، اشیاء و فضاهای نام
19 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت سیزدهم :: آشنایی با فیلدها و رفتارها
20 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت چهاردهم :: آشنایی با Property ها
21 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت پانزدهم :: آشنایی با سازنده ها و روش های ایجاد اشیاء
22 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت شانزدهم :: وراثت یا Inheritance
23 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت هفدهم :: آشنایی با مفهوم Polymorphism
24 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت هجدهم:: کلاس های abstract و sealed
25 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت نوزدهم :: سازنده ها در وراثت، کلمه کلیدی protected و فیلدهای readonly
26 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیستم :: کلاس های static و partial و Extension Method ها
27 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و یکم :: Reference Types و Value Types
28 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و دوم :: آشنایی با کاربرد interface ها
29 آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و سوم :: آشنایی با مفاهیم Inversion of Control و Dependency Injection
30 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و چهارم :: آشنایی با مفهوم Type Casting و انواع Cast ها
31 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و پنجم :: آشنایی با operator overloading و تعریف cast ها
32 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و ششم :: مفاهیم boxing و unboxing
33 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و هفتم :: قابلیت Generics
34 آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و هشتم :: نکات تکمیلی Generic ها، کلاس List و کلاس Dictionary
35 آموزش زبان سی شارپ -قسمت بیست و نهم (پایانی): استثناء ها (Exceptions) و مدیریت خطاها در سی شارپ
دوره مجموعه کل دوره
مطالب مرتبط

در حال دریافت اطلاعات

نظرات
هیچ نظری ارسال نشده است

    برای ارسال نظر ابتدا به سایت وارد شوید