Generic ها در #C

چهارشنبه 2 تیر 1395

در این مقاله مفهوم Generic ها در سی شارپ ، نحوه ی به کارگیری آن ها، مزایای استفاده از آن ها و نوآوری هایی که می توانیم با استفاده از این نوع داده ها ایجاد کنیم (مانند constrain ها ، متدهای Generic و ارث بری های generic ) را بررسی خواهیم کرد. همچنین درباره ی بهینه سازی Generic ها توسط NET Framework. مطالبی ارائه خواهیم کرد.

Generic ها در #C

Genericها چیستند؟

Generic ها به شما اجازه می دهند ساختار داده های امن بدون وابستگی به داده های حقیقی تعریف کنید. با استفاده و رعایت این موارد، سرعت برنامه و همچنین کیفیت کدها به طرز قابل توجهی افزایش پیدا می کند. زیرا شما الگوریتم های پردازشی مربوط به استفاده مجدد از داده ها را به کار می گیرید بدون این که چندین بار مجبور باشید کدنویسی انجام بدهید.

Generic ها شبیه قالب های C++ هستند اما تفاوت های قابل توجهی در نحوه ی استفاده  و همچنین قابلیت ها دارند.  این مقاله در مورد مشکل فضای آدرس دهی generic ها، به کارگیری آن ها، مزایای مدل های برنامه نویسی و همچنین ابتکاراتی که می توانیم با این نوع داده ها ایجاد کنیم ، بحث می کند. شما همچنین مطالبی در مورد نحوه ی بهینه سازی Generic ها در زمینه های مختلف  .NET Framework (مانند آرایه ها، reflection ، مجموعه ها، سریال سازی ، remoting و ....) نیز خواهید آموخت.

Generic Assembly

Generices  یک مجموعه است که در فضای نام زیر قابل استفاده است.

Generic ها به شما اجازه می دهند تا نوع داده ی استفاده شده در یک متد و یا یک کلاس را زمانی مشخص کنید که آن داده در زمان اجرای برنامه مورد نیاز باشد. (یعنی اجباری به تعریف نوع داده در ابتدای نوشتن کدها نیست و تا زمانی که داده ، وارد روند اجرای پروژه نشده است، امکان تعریف آن برای برنامه نویس وجود دارد.)به عبارت دیگر Generic ها به شما اجازه می دهند کلاس و یا متدی بنویسید که می تواند خودش را با هر نوع داده ای انطباق بدهد.

شما تعریف یک کلاس و یا یک متد را به همراه پارامترهای مورد نیاز برای داده ها می نویسید، زمانی که کامپایلر با یک سازنده  (constructor) مواجه می شود که مربوط به یک کلاس و یا یک تابع فراخوانی است، کد مورد نیاز برای مدیریت داده های موجود در آن ها را تولید می کند. یک مثال ساده برای درک مفهوم این مطلب در زیر آورده شده است:

ایجاد Generic List<T>

Generic List collection مانند یک آرایه است.شما یک لیست تعریف می کنید ، داده های آن را مقدار دهی و پر می کنید و سپس با انجام این امور می توانید به اعضای موجود در آن دسترسی پیدا کنید.

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

Sample Generic List <int>
List<int> myValue = new List<int>();
Sample Generic List <string>
List<string> myValue = new List<string>();

در مثال بالا هر دو کد میتوانند با genericsجایگزین هم شوند.

List<T> myValue = new List<T>();

با استفاده از[T]  میتوان به صورت "int" ,"string"یا هر نوع دیگر  ، داده ها را بر اساس نیاز نرم افزار استفاده کرد.

ویژگی Generics

Generic ها ویژگی های بسیار مفیدی دارند که می توانند با استفاده از این ویژگی ها عملکرد عملیات های موجود در برنامه را بهبود ببخشند و قابلیت هایی مانند استفاده مجدد از کد، امنیت و کارایی را برای شما فراهم کنند.

شما میتوانید مجموعه از کلاس های  Genericsشده ایجاد کنید.کتابخانه  .Netframework  شامل مجموعه از کلاس های Generic  شده است که در فضای نام  System.Collections.Generic قرار دارد  که قبلا راجب آن صحبت کرد ایم .

شما میتوان از مجموعه کلاس های  Generivc شده به جای  System.Collectionsاستفاده کنید.

شما میتوانید خودتان یک Generic interfaces که از  class ,  methods ,  events تشکیل شده ایجاد کنید.

شما میتوانید  Generic classes constrained  ایجاد کنید که قادر به درسترسی متد های به انواع داده می باشد.

شما می توانید اطلاعات مربوط به انواع داده های generic را در زمان اجرا به وسیله ی reflection   به دست بیاورید.

مزایای استفاده از Generics

Generics در .NET به شما اجازه می دهند چندین بار از کدی که نوشته اید، استفاده کنید. انواع و داده های داخلی می توانند بدون مشکلی در ساختار کد ها تغییر کنند و هیچ وابستگی ای به مقادیر و یا منابع شما نیز نخواهند داشت. شما می توانید یک بار برنامه را بنوسید،آن را تست کنید و آن را با هر نوع داده دیگری که دوست دارید در دفعات بعدی مورد استفاده قرار بدهید. و همه این موارد از امنیت و پشتیبانی کامپایلر نیز برخودار هستند.

کدهای generic شما را مجبور به فشرده سازی کدها و مقادیر و منابع و مقادیر نمی کنند و کارایی را به صورت قابل توجهی افزایش می دهند.

با این نوع داده ها کارایی برنامه ها بسیار بالا رفته است و با استفاده از reference type ها نیز این مقدار چندین برابر می شود.

کدی که در این مقاله برای شما ضمیمه شده است شامل یک برنامه ی micro-benchmark ، که یک پشته را در یک حلقه ی کوتاه اجرا می کند. این برنامه به شما امکان تجربه کار با مقادیر و انواع reference ها را می دهد، همچنین می توانید تعداد دفعات تکرار حلقه را نیزبا توجه به کارایی مورد نیازتان تغییر بدهید.

Generics نمونه و استفاده از generics

1.	using System;  
2.	using System.Collections.Generic;  
3.	namespace GenericSampleApp  
4.	{  
5.	    /// <summary>  
6.	    /// SampleGenericArray  
7.	    /// </summary>  
8.	    /// <typeparam name="T"></typeparam>  
9.	    public class SampleGenericArray < T >   
10.	      {  
11.	        private T[] array;  
12.	        /// <summary>  
13.	        /// SampleGenericArray - Constructor  
14.	        /// </summary>  
15.	        /// <param name="size">size</param>  
16.	        public SampleGenericArray(int size)   
17.	      {  
18.	            array = new T[size + 1];  
19.	        }  
20.	        /// <summary>  
21.	        /// getMyItem - Get Property to return the value  
22.	        /// </summary>  
23.	        /// <param name="index">index</param>  
24.	        /// <returns></returns>  
25.	        public T getMyItem(int index)  
26.	        {  
27.	            return array[index];  
28.	        }  
29.	        /// <summary>  
30.	        /// setMyItem - Set the Property to set value  
31.	        /// </summary>  
32.	        /// <param name="index">index</param>  
33.	        /// <param name="value">value</param>  
34.	        public void setMyItem(int index, T value)  
35.	        {  
36.	            array[index] = value;  
37.	        }  
38.	    }  
39.	    public class SampleTest {  
40.	        /// <summary>  
41.	        /// Main  
42.	        /// </summary>  
43.	        /// <param name="args"></param>  
44.	        public static void Main(string[] args) {  
45.	            //Declaring an int array  
46.	            SampleGenericArray < int > intArray = new SampleGenericArray < int > (5);  
47.	            //Setting up of values  
48.	            for (int c = 0; c < 5; c++) {  
49.	                intArray.setMyItem(c, c * 5);  
50.	            }  
51.	            //Retrieving the values  
52.	            for (int c = 0; c < 5; c++) {  
53.	                Console.Write(intArray.getMyItem(c) + " ");  
54.	            }  
55.	            Console.WriteLine();  
56.	            //Declaring a character array  
57.	            SampleGenericArray < char > charArray = new SampleGenericArray < char > (5);  
58.	            //Setting values  
59.	            for (int c = 0; c < 5; c++) {  
60.	                charArray.setMyItem(c, (char)(c + 97));  
61.	            }  
62.	            //Retrieving the values  
63.	            for (int c = 0; c < 5; c++) {  
64.	                Console.Write(charArray.getMyItem(c) + " ");  
65.	            }  
66.	            Console.WriteLine();  
67.	            Console.ReadKey();  
68.	        }  
69.	    }  
70.	}  

آموزش سی شارپ

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

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

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

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