Generics در زبان سی شارپ
Generic به معنای شکل کلی است، نه خاص. در سی شارپ، عمومی به معنای خاص نبودن برای یک نوع داده خاص است.
سی شارپ به شما اجازه می دهد تا کلاس های generic، رابط ها، کلاس های انتزاعی، فیلدها، متدها، متدهای استاتیک، ویژگی ها، events ، delegates و عملگرها را با استفاده از نوع پارامتر (type parameter) و بدون نوع داده خاص تعریف کنید. نوع parameter یک نگهدارنده برای یک نوع خاص است که هنگام ایجاد یک نمونه از نوع generic مشخص شده است.
یک نوع generic با تعیین یک نوع پارامتر در یک براکت پس از یک نام ، به عنوان مثال، <TypeName<T تعریف می شود که در آن T یک Type است.
Generic Class
generic class ها کلاس هایی هستند که نوع داده آن ها مشخص و از پیش تعریف شده نیستند و در زمان استفاده از آن ها تعیین می شوند. ما معمولا تا الان کلاس هایی را تعریف می کردیم و در هر کدام از کلاس ها صفت ها و متدهایی تعریف می کردیم و روی نوع داده های مخصوصی که نیاز داشتیم کار می کردیم، یعنی براساس نیاز ، یک کلاس تعریف می کردیم و با نوع داده خاصی کار می کردیم. در این بخش از آموزش زبان برنامه نویسی سی شارپ، یاد می گیریم کلاس هایی تعریف کنیم که در لحظه تعریف نوع داده ی کلاس مشخص نیست و در لحظه استفاده از کلاس نوع داده آن را مشخص می کنیم، به این نوع کلاس ها generic class گفته می شوند. به عبارت دیگر، generic به شما امکان می دهد یک کلاس یا متد بنویسید که بتواند با هر نوع داده ای کار کند.
کلاس های عمومی یا generic با استفاده از نوع پارامتر در یک جفت براکت زاویه دار بعد از نام کلاس تعریف می شوند. در ادامه یک کلاس generic تعریف شده است.
در بالا، DataStore یک کلاس generic است. T نوع پارامتر نامیده می شود ، که می تواند به عنوان یک نوع از فیلدها، ویژگی ها، پارامترهای متد، انواع بازگشتی و delegate ها در کلاس DataStore استفاده شود. به عنوان مثال، Data یک ویژگی generic است زیرا ما از یک T به عنوان نوع این ویژگی به جای نوع داده خاص استفاده کرده ایم.
نکته:
استفاده از T به عنوان نوع پارامتر الزامی نیست. شما می توانید هر نامی را به نوع پارامتر بدهید. به طور کلی، T زمانی استفاده می شود که تنها یک نوع پارامتر وجود داشته باشد. توصیه می شود از یک نام قابل خواندن تر بر اساس نیاز استفاده کنید مانند TSession، TKey، TValue و غیره.
همچنین می توانید نوع پارامترهای چندگانه را که با کاما از هم جدا شده اند تعریف کنید.
نمونه سازی کلاس Generic
می توانید با تعیین نوع واقعی در براکت ها، نمونه ای از کلاس های عمومی ایجاد کنید. شکل زیر یک نمونه از کلاس عمومی DataStore ایجاد می کند.
در بالا، هنگام ایجاد یک نمونه، نوع رشته را در براکت ها تعیین کردیم. بنابراین، هر جا که T در کل کلاس در زمان کامپایل استفاده شود، T با یک نوع رشته جایگزین می شود. بنابراین، نوع ویژگی Data رشته خواهد بود.
شکل زیر نحوه عملکرد generics را نشان می دهد.
می توانید یک مقدار رشته ای را به ویژگی Data اختصاص دهید. تلاش برای اختصاص مقادیری غیر از رشته منجر به خطای زمان کامپایل می شود.
همانطور که در زیر نشان داده شده است می توانید انواع مختلف داده را برای اشیاء مختلف تعیین کنید.
خروجی قطعه کد بالا به صورت زیر است.
Hello World!
100
100, Hundred
IT, Information Technology
ویژگی های کلاس Generic
1- یک کلاس generic قابلیت استفاده مجدد را افزایش می دهد. هر چه نوع پارامترها بیشتر می شود به این معنی است که قابل استفاده مجددتر می شود. با این حال، تعمیم بیش از حد، درک و نگهداری کد را دشوار می کند.
2- یک کلاس generic می تواند یک کلاس پایه برای سایر کلاس های generic یا non-generic یا کلاس های انتزاعی (abstract) باشد.
3- یک کلاس generic می تواند از سایر رابط های generic یا non-generic ، کلاس ها یا کلاس های abstract مشتق شود.
فیلدهای Generic
یک کلاس generic می تواند شامل فیلدهای generic باشد. با این حال، نمی توان آن را مقداردهی اولیه کرد.
آنچه که در زیر نشان داده شده است تعریف یک آرایه generic می باشد.
متدهای Generic
متدی که با نوع پارامترها برای نوع برگشتی یا پارامترها تعریف شده باشد، متد generic نامیده می شود.
در بالا، متدهای ()AddorUpdate و ()GetData متدهای generic هستند. نوع داده واقعی پارامتر آیتم در زمان نمونه سازی کلاس <DataStore<T، همانطور که در زیر نشان داده شده است، مشخص می شود.
خروجی قطعه کد بالا عدد 50 است.
نوع پارامتر generic را می توان با پارامترهای متعدد با یا بدون پارامترهای non-generic و نوع بازگشتی استفاده کرد. موارد زیر valid generic method overloading هستند.
یک کلاس non-generic می تواند با تعیین یک نوع پارامتر در براکت با نام متد، مانند شکل زیر، متدهای generic را شامل شود.
خروجی قطعه کد بالا به صورت زیر است.
200
Hello
World!
مزایای Generics
1- Generics قابلیت استفاده مجدد کد را افزایش می دهد. برای مدیریت انواع مختلف داده نیازی به نوشتن کد ندارید.
2- Generics از نظر نوع ایمن هستند. اگر بخواهید از نوع داده ای متفاوت از نوع مشخص شده در تعریف استفاده کنید، با خطاهای زمان کامپایل مواجه می شوید.
3- Generic یک مزیت از لحاظ عملکرد دارد زیرا امکان boxing و unboxing را حذف می کند.