متدهای جنریک
اگر بخواهید چندین متد با عملکرد مشابه ایجاد کنید و فقط تفاوت آنها در نوع دادهای باشد که قبول میکنند (مثلاً یکی نوع int و دیگری نوع double را قبول کند) میتوان از متدهای جنریک برای صرفه جویی در کدنویسی استفاده کرد. ساختار عمومی یک متد جنریک به شکل زیر است :
returnType methodName<type> (type argument1) { type someVariable; }
مشاهده میکنید که بعد از نام متد یک نوع در داخل دو علامت بزرگتر و کوچکتر آمده است ( <type> ) که همه انواع در سی شارپ میتوانند جایگزین آن شوند. برنامه زیر مثالی از نحوه استفاده از متد جنریک میباشد :
using System; public class Program { public static void Show<X>(X val) { Console.WriteLine(val); } public static void Main() { int intValue = 5; double doubleValue = 10.54; string stringValue = "Hello"; bool boolValue = true; Show(intValue); Show(doubleValue); Show(stringValue); Show(boolValue); } }
5 10.54 Hello true
یک متد جنریک ایجاد کردهایم که هر نوع دادهای راقبول کرده و مقادیر آنها را نمایش میدهد (خطوط 8-5). سپس دادههای مختلفی با وظایف یکسان به آن ارسال میکنیم. متد نیز نوع X را بسته به نوع دادهای که به عنوان آرگومان ارسال شده است تغییر میدهد. به عنوان مثال وقتی یک داده از نوع int ارسال میکنیم، همه مکانهایی که X در آنها وجود دارد به int تبدیل میشوند و متد به صورت زیر در میآید :
public static void Show (int val) { Console.WriteLine(val); }
همچنین هنگام فراخوانی متد جنریک صریحاً میتوانید نوعی را که به وسیله آن مورد استفاده قرار میگیرد ذکر کنید (البته لازم نیست). به عنوان مثال فراخوانیهای متد بالا را میتوان به صورت زیر هم نوشت :
Show<int>(intValue); Show<double>(doubleValue); Show<string>(stringValue); Show<bool>(boolValue);
به یک نکته در مورد استفاده از متدهای جنریک توجه کنید و آن این است که، قبل از دانت نت 4.5، انجام محاسبات به وسیله متدهای جنریک امکان پذیر نبود. یعنی شما نمی توانستید که دو عدد را با هم جمع کنید:
public static void Show<X>(X val1, X val2) { Console.WriteLine(val1 + val2); }
ولی در نسخه 4.5 دات نت این مشکل با استفاده از کلمه کلیدی dynamic به صورت زیر قابل حل است :
Console.WriteLine((dynamic)val1 + (dynamic)val2);
شما میتوانید چندین نوع خاص را برای متد جنریک ارسال کنید، برای این کار هر نوع را به وسیله کاما از دیگری جدا کنید.
public static void Show<X, Y>(X val1, Y val2) { Console.WriteLine(val1); Console.WriteLine(val2); }
به مثال زیر که در آن دو مقدار مختلف به متد ارسال شده است توجه کنید :
Show(5, true); // OR Show<int, bool>(5, true);
مشاهده میکنید که X با نوع int و Y با نوع bool جایگزین میشود. این نکته را نیز یادآور شویم که شما میتوانید دو آرگومان هم نوع را هم به متد ارسال کنید :
Show(5, 10); // OR Show<int, int>(5, true);
برادر مطلب فوق عالی بود دستت درد نکنه خدا خیرت بده
سلام بله میدونم اینو …اما مطالب هم باید بروز باشه دیگه…بهرحال الان شدنیه
سلام، بله، حق با شماست و انشالله مطالب رو به روز می کنیم. مطلب فوق رو هم با اجازتون اصلاح کردم. بسیار ممنون بابت راهنماییتون.
موفق و موید باشین
سلام استاد خوب در واقع هم انجام شدنیه هم بسیار سادس. فقط کافیه قبل val1 و val2 کلمه کلیدی dynamic (حتما داخل پرانتز باشه) رو اضافه کنید.
کامپایلر سیشارپ اگر نتواند نوعهای عملوندها را در حین بکارگیری عملگرها تشخیص دهد، اجازهی استفاده از عملگر را نخواهد داد. چون در متدهای Generic نوع پارامترها مشخص نیست نمیتوان بر روی آنها اعمال ریاضی انجام داد. برای حل این مشکل باید از واژهی کلیدی dynamic استفاده کرده و بررسی نوع دادهها را به زمان اجرا موکول کنیم.
سلام
البته به این نکته توجه کنید که Dynamic در نسخه 4.5 به دات نت اضافه شده.بنابراین در نسخه های قبلی که استفاده از آن ها مرسوم تر است (مانند نسخه 4) این امکان وجود نداشته.
سلام ممنون از سایت بسیار خوبتون…من آموزش های شما رو همیشه دنبال میکنم…بسیار ساده و روان توضیح میدید ولی یک انتقاد کوچیک داشتم اونم اینکه شما اینجا گفتید ما نمیتونیم اعمال ریاضی رو جنریک ها انجام بدیم…در صورتیکه میشه و راه حل داره….شمام قطعا میدونید ولی نمیدونم چرا ذکر نکردید….اگر هم میخواستید تو این قسمت نیارید باید میگفتید که راه حل داره(که بعد توضیح داده خواهد شد.) من چون هنوز تازه کارم اول فکر کردم دیگه راهی نیست. لطف کنید که برای ما تازه کارا کامل توضیح بدید.
سلام، بسیار ممنون بابت لطف و انتقادتون
راستش بنده چند منبع خارجی رو خوندم و لب مطلب رو به صورت این سایت و کتاب درآوردم. توی این منابعی که خوندم، همه اینو گفتن که نمیشه عملیات ریاضی رو انجام داد. البته با توجه به اینکه توی متدهای جنریک هیچ نوعی وجود نداره و کامپایلر با توجه به مقادیری که می گیره نوع رو تشخیص میده، طبیعیه که همچین چیزی عملی نباشه. شما اگه مثلا همین کد زیر رو تو ویژوال استودیو کپی کنید، پیغام خطا میده
شاید با یه تعیین نوع و یا سربارگذاری عملگرها و … بشه همچین کاری کرد، که اگرم بشه، شاید لازم باشه مطالبی رو توضیح داده که واسه کاربران مبتدی خیلی سخت باشه. در نهایت، بنده بلد نیستم و ممنون میشم اگه راهی داره، شما با یه مثال و توضیح ساده بفرمایید تا مطلب رو اصلاح کنم. حداقل چیزی که من می دونم اینه که اگه متد به صورت بالا تعریف بشه، عملیات ریاضی امکان نیست.
حق اشتراک ماهیانه سایتتون واقعا بالاست…!
سعی کنید پولی که دریافت می کنید متناسب با نحوه و میزان ارائه مطالبتان باشه…!
سلام دوست عزیز، بسیار ممنون بابت نظرتون
خیلی برام جالبه که ماها فقط روزانه 30-40 هزار هزینه چیپس و پفک می کنیم و اونوقت که نوبت به یادگیری میرسه ، اونم یادگیری بالای 800 مطلب اموزشی ، حاضر به پرداخت 10 هزار تومان نیستیم!!!
شما تو کدوم سایت مطالبی با این روانی و سادگی پیدا می کنید؟
اینو هم اضافه کنم که این تعداد مطلب رو تو آموزشگاه ها با 500 هزار هم آموزش نمیدن
شاید باورتون نشه ولی برخی مطالب به خاطر وسواس فراوان حدود 2 روز زمان میبره تا تو سایت قرار داده بشن
موفق و موید باشین
سلام دوست عزیز…من در شهری زندگی می کنم که هزینه یک روز یک خانواده به زور به 10هزار تومن میرسه و درآمد از این هم پایین تره…!(حالا شاید توی یک سال هم چیپس یا پفک به چشم نبینن)…سایت هایی به زبان فارسی و سایتهای بسیار بسیار زیادی به زبان انگلیسی در دسترس هستند و همچنین کتابهای فراوان چه توی اینترنت و چه توی بازار (که همه نویسنده هاشون نویسنده معتبر جهانی هستند مثل: دایتل و دایتل)…آموزشگاه هم که اوضاعش کاملا فرق میکنه و فرد با استاد رودر رو هست و همین کیفیت یادگیری رو چندین برابر میکنه ( همنطور که ما نمیتونیم صرفا کتاب خوندن رو جایگزین دانشگاه رفتن کنیم)…موفق و مؤید باشید…!
حق با شماست
من نمی دونم از کی با سایت بنده آشنا شدین، ولی یه زمانی اشتراک VIP هزینش 2000 تومان بود باز هم اعتراض می کردن، بنده به تجربه و در طول این سه سال که سایت رو راه اندازی کردم به این پی بردم که ((ایراد بنی اسرائیلی))، همیشه هست، کسی که طالب علم باشه حاضره هزینه کنه و کسی هم که نباشه شما مطلب مفت بذاری ، میگه چرا مفته!!!!!
منم این مطالب رو اکثرا ترجمه کردم و در کل براشون زحمت کشیدم، خیلی هاشون رو هم به تجربه گذاشتم. من تمام کتاب های بازار ایران رو دارم همین دایتل و دایتل رو که می فرمایید یکی از مطالبش رو با معادل اون تو سایت مقایسه بفرمایید و ببینید کدوم بهتره.
در مورد استاد هم باید عرض کنم درسته سر کلاس بودن خوبه ولی قبول کنید که اون دوره دیگه گذشته که آدم عمرشو سر کلاس تلف کنه، الان فیلم های آموزشی هیچ نقطه ابهامی واسه آدم نمیذارن
! Perfect
باسلام
بنده مطالعه کردم.مطالب مفیدی بود.
تشکر میکنم به خاطر آموزش های شما.
سلام، لطف دارین
خیلی خوب گفتی – مرسی.