
یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شیگرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفهای و امکانات کامل!
مشاهده بیشتر
یادگیری MVC Core از مبانی تا پیشرفته: شیگرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژههای کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!
مشاهده بیشترمشخصات مقاله
Generic ها و ساخت آن در C#
Generic ها
با استفاده از Generic ها میتوانید مشخصات نوع دادهی عناصر برنامهنویسی را در یک کلاس یا یک متد تعریف کنید. به شرط آن که این نوع واقعاً در برنامه استفاده شده باشد. به بیان دیگر با استفاده از Generic ها میتوانید کلاس یا متدی را بنویسید که بتواند در کنار هر نوع دادهای کار کند.
جهت نوشتن مشخصات کلاس یا متد، باید از پارامترهای جایگزین برای نوع دادهها استفاده کنید. زمانی که کامپایلر به سازندهی کلاس یا با فراخوان تابع یک متد برخورد میکند، جهت کنترل نوع مشخص داده، کدی را تولید میکند. با استفاده از مثال سادهی زیر میتوان این مطلب را بهتر بیان کرد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | using System; using System.Collections.Generic; namespace GenericApplication { public class MyGenericArray< T > { private T[] array ; public MyGenericArray(int size) { array = new T[size + 1]; } public T getItem(int index) { return array [index]; } public void setItem(int index, T value) { array [index] = value; } } class Tester { static void Main(string[] args) { //declaring an int array MyGenericArray< int > intArray = new MyGenericArray< int >(5); //setting values for (int c = 0; c < 5; c++) { intArray.setItem(c, c*5); } //retrieving the values for (int c = 0; c < 5; c++) { Console.Write(intArray.getItem(c) + " " ); } Console.WriteLine(); //declaring a character array MyGenericArray< char > charArray = new MyGenericArray< char >(5); //setting values for (int c = 0; c < 5; c++) { charArray.setItem(c, (char)(c+97)); } //retrieving the values for (int c = 0; c< 5; c++) { Console.Write(charArray.getItem(c) + " " ); } Console.WriteLine(); Console.ReadKey(); } } } <button></button> |
زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده میشود:
1 2 3 | 0 5 10 15 20 a b c d e <button></button> |
ویژگیهای Generic ها
Generic ها تکنیکهایی هستند که با استفاده از آنها میتوانید برنامهی خود را به صورتهای زیر توسعه دهید:
- با استفاده از این تکنیک میتوانید عملکرد، ایمنی نوع و استفادهی مجدد کد خود را به حداکثر برسانید.
- میتوانید کلاسهای مجموعهای را به صورت Generic درآورید. کتابخانهی کلاس فریمورک.NET در فضای نام System.Collections.Generic دارای چندین کلاس مجموعهای Generic جدید است. میتوانید به جای کلاسهای مجموعهای موجود در فضای نام System.Collections از این کلاسها استفاده کنید.
- میتوانید رابطها، کلاسها، متدها، رویدادها و نمایندههای Generic مخصوص به خود را ایجاد کنید.
- میتوانید کلاسهای Generic ی را تولید کنید که محدود به دسترسی به متدهای نوعهای خاصی از داده هستند.
- میتوانید اطلاعات نوعهای استفاده شده در یک نوع Generic داده را با استفاده از انعکاس و در زمان اجرا دریافت کنید.
متدهای Generic
در مثال قبل از یک کلاس Generic استفاده کردیم؛ میتوانیم به همراه یک پارامتر نوع متدهای Generic را اعلان کنیم. در برنامهی زیر این مفهوم توضیح داده شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | using System; using System.Collections.Generic; namespace GenericMethodAppl { class Program { static void Swap< T >(ref T lhs, ref T rhs) { T temp; temp = lhs; lhs = rhs; rhs = temp; } static void Main(string[] args) { int a, b; char c, d; a = 10; b = 20; c = 'I' ; d = 'V' ; //display values before swap: Console.WriteLine( "Int values before calling swap:" ); Console.WriteLine( "a = {0}, b = {1}" , a, b); Console.WriteLine( "Char values before calling swap:" ); Console.WriteLine( "c = {0}, d = {1}" , c, d); //call swap Swap< int >(ref a, ref b); Swap< char >(ref c, ref d); //display values after swap: Console.WriteLine( "Int values after calling swap:" ); Console.WriteLine( "a = {0}, b = {1}" , a, b); Console.WriteLine( "Char values after calling swap:" ); Console.WriteLine( "c = {0}, d = {1}" , c, d); Console.ReadKey(); } } } <button></button> |
زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده میشود:
1 2 3 4 5 6 7 8 9 | Int values before calling swap: a = 10, b = 20 Char values before calling swap: c = I, d = V Int values after calling swap: a = 20, b = 10 Char values after calling swap: c = V, d = I <button></button> |
نمایندههای Generic
میتوانید به کمک پارامترهای نوع، نمایندههای Generic را تعریف کنید. برای مثال:
1 2 | delegate T NumberChanger< T >(T n); <button></button> |
در مثال زیر کاربرد این نماینده نشان داده شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | using System; using System.Collections.Generic; delegate T NumberChanger< T >(T n); namespace GenericDelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { //create delegate instances NumberChanger< int > nc1 = new NumberChanger< int >(AddNum); NumberChanger< int > nc2 = new NumberChanger< int >(MultNum); //calling the methods using the delegate objects nc1(25); Console.WriteLine( "Value of Num: {0}" , getNum()); nc2(5); Console.WriteLine( "Value of Num: {0}" , getNum()); Console.ReadKey(); } } } <button></button> |
زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده میشود:
1 2 3 | Value of Num: 35 Value of Num: 175 <button></button> |