ویژگی‌های جدید C# 2.0

ویژگی‌های جدید C# 2.0

نسخه C# 2.0 که در نوامبر 2005 و همراه با Visual Studio 2005 منتشر شد، نقطه عطفی در تاریخچه این زبان محسوب می‌شود. این نسخه مجموعه‌ای از قابلیت‌های جدید را معرفی کرد که باعث بهبود قابلیت خوانایی، انعطاف‌پذیری و نوع‌پذیری زبان شد. در ادامه به بررسی ویژگی‌های کلیدی این نسخه می‌پردازیم:

1. Generics (کلیات)

یکی از مهم‌ترین ویژگی‌های اضافه‌شده در نسخه 2.0، Generics بود. Generics به توسعه‌دهندگان این امکان را می‌دهد که کلاس‌ها، متدها و واسط‌هایی بنویسند که روی هر نوع داده‌ای عمل کنند، بدون این‌که ایمنی نوع (Type Safety) از بین برود.

چرا Generics مهم است؟

قبل از Generics، برای ایجاد لیستی از یک نوع خاص، از کلاس‌های عمومی مانند ArrayList استفاده می‌شد. این رویکرد نیاز به تبدیل (Casting) مکرر داشت و باعث بروز خطاهای زمان اجرا می‌شد.

مثال: استفاده از Generics

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // بدون Generics
        System.Collections.ArrayList list = new System.Collections.ArrayList();
        list.Add(10);
        list.Add("Hello"); // این باعث خطا نمی‌شود

        // با Generics
        List numbers = new List();
        numbers.Add(10);
        // numbers.Add("Hello"); // این باعث خطای کامپایل می‌شود
        foreach (int number in numbers)
        {
            Console.WriteLine(number);
        }
    }
}

مزایا:

  • جلوگیری از خطاهای زمان اجرا با اطمینان از نوع داده.
  • افزایش خوانایی کد.
  • بهبود عملکرد به دلیل عدم نیاز به تبدیل نوع.

2. Partial Types (کلاس‌های جزئی)

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

مثال: Partial Types

// File1.cs
public partial class MyClass
{
    public void Method1()
    {
        Console.WriteLine("Method1");
    }
}

// File2.cs
public partial class MyClass
{
    public void Method2()
    {
        Console.WriteLine("Method2");
    }
}

// Main Program
class Program
{
    static void Main()
    {
        MyClass obj = new MyClass();
        obj.Method1();
        obj.Method2();
    }
}

3. Anonymous Methods (متدهای بی‌نام)

متدهای بی‌نام به شما اجازه می‌دهند که یک بلوک کد را بدون نیاز به تعریف یک متد جداگانه، درجا به یک Delegate اختصاص دهید.

مثال: Anonymous Methods

using System;

delegate void Print(string message);

class Program
{
    static void Main()
    {
        Print print = delegate (string message)
        {
            Console.WriteLine(message);
        };

        print("Hello from Anonymous Method!");
    }
}

مزایا:

  • کاهش کدهای اضافی.
  • مناسب برای کدهایی که فقط یک‌بار استفاده می‌شوند.

4. Nullable Value Types (نوع‌های مقدار Nullable)

در این نسخه، می‌توانید نوع‌های مقداری مانند int، bool و float را به‌صورت nullable تعریف کنید. این قابلیت زمانی مفید است که نیاز دارید متغیری مقدار “خالی” (null) داشته باشد.

مثال: Nullable Value Types

using System;

class Program
{
    static void Main()
    {
        int? number = null;

        if (number.HasValue)
        {
            Console.WriteLine($"Number: {number.Value}");
        }
        else
        {
            Console.WriteLine("Number is null");
        }
    }
}

مزایا:

  • پشتیبانی از حالت “نداشتن مقدار” برای نوع‌های مقداری.
  • کاهش نیاز به مقادیر پیش‌فرض غیرمنطقی.

5. Iterators (تکرارگرها)

تکرارگرها به شما اجازه می‌دهند که از متدهای ویژه‌ای مانند yield return استفاده کنید تا آیتم‌ها را در یک مجموعه تکرار کنید. این قابلیت در حلقه‌های foreach بسیار مفید است.

مثال: Iterators

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        foreach (int number in GetNumbers())
        {
            Console.WriteLine(number);
        }
    }

    static IEnumerable GetNumbers()
    {
        yield return 1;
        yield return 2;
        yield return 3;
    }
}

مزایا:

  • ساده‌سازی فرآیند تکرار.
  • افزایش خوانایی کد.

6. Covariance and Contravariance (هم‌ریختی و ناهم‌ریختی)

این مفاهیم به شما اجازه می‌دهند که نوع‌های مشتق‌شده را در اینترفیس‌ها یا Delegates استفاده کنید. این ویژگی به Generics انعطاف‌پذیری بیشتری می‌دهد.

مثال: Covariance و Contravariance

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        IEnumerable strings = new List { "Hello", "World" };
        IEnumerable objects = strings; // Covariance

        Action action = (object obj) => Console.WriteLine(obj);
        Action stringAction = action; // Contravariance

        foreach (var item in objects)
        {
            stringAction(item);
        }
    }
}

7. سایر ویژگی‌ها

Getter/Setter Separate Accessibility (دسترسی جداگانه برای Getter و Setter)

به شما اجازه می‌دهد که سطح دسترسی متفاوتی برای getter و setter یک property تعریف کنید.

public class MyClass
{
    public int MyProperty { get; private set; }
}

Static Classes (کلاس‌های ایستا)

کلاس‌هایی که فقط شامل اعضای ایستا (static) هستند.

public static class Utility
{
    public static void Print(string message)
    {
        Console.WriteLine(message);
    }
}

Delegate Inference (استنتاج Delegate)

اجازه می‌دهد که یک متد را مستقیماً به یک Delegate اختصاص دهید.

Action print = Console.WriteLine;
print("Hello, Delegate Inference!");

جمع‌بندی

نسخه C# 2.0 با معرفی Generics، Anonymous Methods، Iterators و سایر ویژگی‌های جدید، زبان را قدرتمندتر و انعطاف‌پذیرتر کرد. این تغییرات به توسعه‌دهندگان کمک کرد تا کدی خواناتر و ایمن‌تر بنویسند.

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
ویژگی‌های جدید C# 3.0

ویژگی‌های جدید C# 3.0

آنچه در این پست میخوانید Language-Integrated Query (LINQ) (پرس‌وجوی یکپارچه با زبان) Lambda Expressions (عبارات لامبدا) Auto-Implemented Properties (خصوصیات خودکار…

بیشتر بخوانید
ویژگی‌های جدید C# 1.2

ویژگی‌های جدید C# 1.2

آنچه در این پست میخوانید حلقه foreach و Dispose چرا Dispose مهم است؟ آنالیز عملکرد foreach در C# 1.2 قبل…

بیشتر بخوانید
ویژگی‌های جدید C# 1.0

ویژگی‌های جدید C# 1.0

آنچه در این پست میخوانید C# 1.0: اولین گام‌ها ویژگی‌های اصلی C# 1.0 1. کلاس‌ها (Classes) 2. ساختارها (Structs) 3….

بیشتر بخوانید

نظرات

سوالات و نظراتتون رو با ما به اشتراک بذارید

برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید.