آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

Generic ها و ساخت آن در C#

دوره های مرتبط با این مقاله

Generic ها

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

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();
 }
 }
}

زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده می‌شود:

0 5 10 15 20
a b c d e

ویژگی‌های Generic ها

Generic ها تکنیک‌هایی هستند که با استفاده از آن‌ها می‌توانید برنامه‌ی خود را به صورت‌های زیر توسعه دهید:

  • با استفاده از این تکنیک می‌توانید عملکرد، ایمنی نوع و استفاده‌ی مجدد کد خود را به حداکثر برسانید.
  • می‌توانید کلاس‌های مجموعه‌ای را به صورت Generic درآورید. کتابخانه‌ی کلاس فریمورک.NET در فضای نام System.Collections.Generic دارای چندین کلاس مجموعه‌ای Generic جدید است. می‌توانید به جای کلاس‌های مجموعه‌ای موجود در فضای نام System.Collections از این کلاس‌ها استفاده کنید.
  • می‌توانید رابط‌ها، کلاس‌ها، متدها، رویدادها و نماینده‌های Generic مخصوص به خود را ایجاد کنید.
  • می‌توانید کلاس‌های Generic ی را تولید کنید که محدود به دسترسی به متدهای نوع‌های خاصی از داده هستند.
  • می‌توانید اطلاعات نوع‌های استفاده شده در یک نوع Generic داده را با استفاده از انعکاس و در زمان اجرا دریافت کنید.

متدهای Generic

در مثال قبل از یک کلاس Generic استفاده کردیم؛ می‌توانیم به همراه یک پارامتر نوع متدهای Generic را اعلان کنیم. در برنامه‌ی زیر این مفهوم توضیح داده شده است:

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();
 }
 }
}

زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده می‌شود:

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

نماینده‌های Generic

می‌توانید به کمک پارامترهای نوع، نماینده‌های Generic را تعریف کنید. برای مثال:

delegate T NumberChanger< T >(T n);

در مثال زیر کاربرد این نماینده نشان داده شده است:

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();
 }
 }
}

زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده می‌شود:

Value of Num: 35
Value of Num: 175

  • 148
  •    184
  • تاریخ ارسال :   1397/08/26

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .