خرید دوره های برنامه نویسی با کیف پولت

جنریک ها (Generics)  در سی شارپ,مزایای استفاده از جنریک در سی شارپ,مزایای <List<T نسبت به ArrayList

جنریک ها (Generics)  در سی شارپ

جنریک ها (Generics)  در سی شارپ امکان ایجاد کلاس‌ و متد انعطاف‌پذیر را فراهم میکنند که می‌توانند با انواع مختلف داده‌ کار کنند

تیم تحریریه
276
0
09 اسفند 1403
لینک کوتاه

جنریک‌ها در سی‌شارپ

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

این قابلیت باعث افزایش انعطاف‌پذیری، قابلیت استفاده مجدد و ایمنی نوع (Type Safety) در برنامه‌نویسی می‌شود.

برای مثال، کلاس <List<T در فضای نام System.Collections.Generic نمونه‌ای از استفاده از جنریک‌ها است که امکان ایجاد لیست‌هایی با انواع مختلف داده را فراهم می‌کند.

یکی از مزایای اصلی جنریک‌ها کاهش کدنویسی تکراری و افزایش عملکرد است، زیرا برخلاف استفاده از object، نیازی به تبدیل نوع (Boxing/Unboxing) ندارند.

برای مثال، می‌توان یک کلاس جنریک برای ذخیره و بازیابی داده‌ها بدون نیاز به تعریف چندین نسخه برای انواع مختلف ایجاد کرد. نمونه‌ای از یک متد جنریک:

 

public T GetMax<T>(T a, T b) where T : IComparable<T>  
{  
    return a.CompareTo(b) > 0 ? a : b;  
}


این متد می‌تواند برای هر نوع داده‌ای که <IComparable<T را پیاده‌سازی کرده باشد، مقدار بزرگ‌تر را برگرداند. 

مثال ساده

 

// تعریف یک کلاس جنریک 

public class GenericRepository<T> 

{ 

    private List<T> items = new List<T>(); 




    public void Add(T item) 

    { 

        items.Add(item); 

    } 




    public T Get(int index) 

    { 

        return items[index]; 

    } 

} 




// استفاده از کلاس جنریک 

GenericRepository<string> repo = new GenericRepository<string>(); 

repo.Add("Hello Generics!"); 

جنریک‌ها در سی‌شارپ

 

 

مزایای استفاده از جنریک در سی شارپ

  • ایمنی نوع (Type Safety)

    کامپایلر از تطابق نوع داده اطمینان حاصل می‌کند و خطاهای زمان اجرا کاهش می‌یابند.
  • کارایی بالا

    حذف عملیات Boxing/Unboxing در مقایسه با استفاده از object.
  • استفاده مجدد از کد

    یک کلاس یا متد جنریک می‌تواند با انواع داده مختلف کار کند.
  • خوانایی کد

    کد تمیزتر و قابل درک‌تر می‌شود.

 

 

مزایای استفاده از جنریک در سی شارپ

 

 

کلاس جنریک  در سی شارپ

کلاس‌های جنریک به شما اجازه می‌دهند تا یک کلاس را با پارامتر نوع (Type Parameter) تعریف کنید.

مثال

 

public class Box<T> 

{ 

    public T Content { get; set; } 

} 




// استفاده 

Box<int> intBox = new Box<int> { Content = 42 }; 

Box<string> stringBox = new Box<string> { Content = "Generics" }; 

 

 

متدهای جنریک

متدهای جنریک امکان تعریف متدهایی با پارامترهای نوع را فراهم می‌کنند.

این متدها می‌توانند در کلاس‌های غیرجنریک نیز وجود داشته باشند.

مثال

 

public static T Max<T>(T a, T b) where T : IComparable<T> 

{ 

    return a.CompareTo(b) > 0 ? a : b; 

} 




// استفاده 

int maxNumber = Max(10, 20); 

string maxString = Max("Apple", "Banana"); 

 

محدودیت نوع در سی شارپ

محدودیت‌های نوع (Type Constraints) به کامپایلر می‌گویند که چه نوع‌هایی می‌توانند به عنوان پارامتر جنریک استفاده شوند.

انواع محدودیت‌ها:

  • where T : struct

    نوع باید مقداری (Value Type) باشد.
  • where T : class

    نوع باید مرجع (Reference Type) باشد.
  • where T() : new

    نوع باید سازنده بدون پارامتر داشته باشد.
  • where T : InterfaceName

    نوع باید یک اینترفیس خاص را پیاده‌سازی کند.

مثال:

public class Factory<T> where T : new() 

{ 

    public T CreateInstance() 

    { 

        return new T(); 

    } 

} 

 

 

آیا به دنبال یک فرصت عالی برای یادگیری برنامه‌نویسی هستید؟ 🚀

با دوره آموزشی سی‌شارپ ما، شما می‌توانید مهارت‌های خود را به سطح جدیدی ارتقا دهید! این دوره به‌طور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامه‌نویسی سی‌شارپ پیش بروید.

👨‍🏫 چرا دوره ما را انتخاب کنید؟

  • محتوای جامع و عملی: با پروژه‌های واقعی و تمرینات عملی، یادگیری را به تجربه‌ای جذاب تبدیل کنید.
  • مدرس مجرب: از تجربه و دانش مدرس حرفه‌ای بهره‌مند شوید که شما را در هر مرحله از یادگیری راهنمایی می‌کنند.
  • پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
  • دسترسی مادام‌العمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، می‌توانید به آن مراجعه کنید.

💡 فرصت را از دست ندهید!

بایادگیری سی‌شارپ، می‌توانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژه‌های جذاب و چالش‌برانگیز شرکت کنید.

همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده‌ای روشن‌تر بردارید!

شرکت در دوره آموزش برنامه نویسی سی شارپ

 

 

 

لیست جنریک (<List<T)

<List<T یک ساختار داده پرکاربرد در سی‌شارپ است که بر اساس جنریک‌ها پیاده‌سازی شده و جایگزین بهینه‌ای برای ArrayList است.

 

مزایای <List<T نسبت به ArrayList

  • نوع‌دهی ایمن

    عدم نیاز به تبدیل نوع (Casting).
  • کارایی بالاتر

    بهینه‌سازی برای انواع داده مقدار (Value Types).

مثال استفاده

List<int> numbers = new List<int> { 1, 2, 3 }; 

numbers.Add(4); 

numbers.Remove(2); 




foreach (int num in numbers) 

{ 

    Console.WriteLine(num); 

} 

 

 

 

مزایای <List<T نسبت به ArrayList

LinkedList

<LinkedList<T یک ساختار داده مبتنی بر گره‌ها است که برای درج و حذف سریع در میانه لیست مناسب است.

 

مقایسه <List<T> و <LinkedList<T

  • <List<T

    دسترسی تصادفی سریع (O(1))، درج/حذف در انتها سریع (O(1)).
  • <LinkedList<T

    درج/حذف در میانه سریع (O(1))، دسترسی تصادفی کند (O(n)).

مثال:

LinkedList<string> names = new LinkedList<string>(); 

names.AddLast("Alice"); 

names.AddLast("Bob"); 

names.AddAfter(names.First, "Charlie"); 

 

 

 

مثال ایجاد یک کلاس جنریک برای مدیریت داده‌ها در سی‌شارپ

سناریو:

فرض کنید در حال توسعه یک سیستم مدیریت داده هستیم و نیاز به ذخیره و بازیابی انواع مختلف داده‌ها (مثل اعداد، رشته‌ها، اشیا سفارشی) داریم.

به جای ایجاد کلاس‌های جداگانه برای هر نوع داده، می‌توان از جنریک‌ها (Generics) برای پیاده‌سازی یک کلاس مدیریت مخزن داده (Data Repository) استفاده کرد.

  •  ایجاد کلاس جنریک <Repository<T برای مدیریت داده‌ها

using System;
using System.Collections.Generic;

public class Repository<T>
{
    private List<T> items = new List<T>();

    // افزودن آیتم جدید
    public void Add(T item)
    {
        items.Add(item);
        Console.WriteLine($"Item added: {item}");
    }

    // دریافت همه آیتم‌ها
    public List<T> GetAll()
    {
        return items;
    }

    // جستجوی آیتم
    public T Find(Predicate<T> match)
    {
        return items.Find(match);
    }
}


این کلاس جنریک به ما اجازه می‌دهد داده‌هایی از هر نوع (T) را مدیریت کنیم، بدون نیاز به تعریف کلاس جداگانه برای هر نوع.

  •  استفاده از <Repository<T برای ذخیره و مدیریت داده‌ها

 استفاده از کلاس برای ذخیره رشته‌ها (string)

var stringRepo = new Repository<string>();
stringRepo.Add("Hello");
stringRepo.Add("World");

var allStrings = stringRepo.GetAll();
Console.WriteLine("All Strings: " + string.Join(", ", allStrings));


خروجی:

Item added: Hello  
Item added: World  
All Strings: Hello, World  

 

  • استفاده از کلاس برای ذخیره اعداد (int)

var intRepo = new Repository<int>();
intRepo.Add(10);
intRepo.Add(20);

var allNumbers = intRepo.GetAll();
Console.WriteLine("All Numbers: " + string.Join(", ", allNumbers));


 خروجی:

 

Item added: 10  
Item added: 20  
All Numbers: 10, 20
  • استفاده از کلاس برای ذخیره اشیای سفارشی (Person)

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override string ToString()
    {
        return $"{Name}, {Age} years old";
    }
}

var personRepo = new Repository<Person>();
personRepo.Add(new Person { Name = "Ali", Age = 30 });
personRepo.Add(new Person { Name = "Sara", Age = 25 });

var foundPerson = personRepo.Find(p => p.Name == "Ali");
Console.WriteLine("Found Person: " + foundPerson);


خروجی:

Item added: Ali, 30 years old  
Item added: Sara, 25 years old  
Found Person: Ali, 30 years old  


با استفاده از جنریک‌ها (Generics) در C#، یک مخزن داده (Repository) ایجاد کردیم که می‌تواند برای انواع مختلف داده‌ها (اعداد، رشته‌ها، اشیای سفارشی) استفاده شود.

این روش باعث کاهش کدنویسی تکراری، افزایش انعطاف‌پذیری و بهبود کارایی می‌شود. 🚀

محصولات مرتبط

کاربران ما

شما هم نظرتون با ما دریاره “جنریک ها (Generics)  در سی شارپ” اشتراک بزارید

برای ارسال نظر لطفا ورود یا ثبت نام کنید

منو