پیش نمایشی از قابلیت های سی شارپ 8

دوشنبه 27 شهریور 1396

در این مقاله می خواهیم در مورد قابلیت های سی شارپ 8 را برای شما بیان کنیم و ویژگی های جدیدی که در آن است را با شما بررسی کنیم .پس لطفا این مقاله را کامل و با دقت فراوان بخوانید.

پیش نمایشی از قابلیت های سی شارپ 8

C# 7.2 & 7.3

نسخه های بعدی زبان سی شارپ 7.2 و 7.3 وحتی کمتر از آن مثل 7.1 توانایی کامل برای نوشتن کد سطح پایین بدون نیاز به استفاده از کلمه کلیدی نا امن تمرکز خواهد کرد.

برخی از ویژگی هایی که قبلا تعریف شده اند مثل رفرنس هایی که فقط خواندنی هستند و blittables و انواع ref-like برای سی شارپ 7.3 هستند.

حالا می خواهیم از ویژگی های سی شارپ 8 صحبت کنیم که شاید بعضی از آن ها تغییر کند و یا شاید بعضی از آن ها اصلا تغییر نکند.

Asynchronous sequences(توالی های نامتقارن)

در سی شارپ 5 ما از async & await استفاده می کردیم

یکی از سناریو هایی که پشتیبانی نشده بود شمارش بود به منظور استفاده از Foreach از روش asynchronous استفاده می کنند شما باید تمام نتایج را به صورت غیر مستقیم بازیابی کنید.

برای مثال این نمونه را ببینید:

IAsyncEnumerable<SearchResult> results =  
    searchEngine.GetAllResults(query);

foreach await (var result in results) { // ... }

کد بالا به اندازه کافی ساده می باشد ولی عملگر های کوئری linq را پشتیبانی می کند

برای بعضی از سناریو ها مانند کوئری هایی از یک پایگاه داده یا ارائه دهنده ی داده هایی که این سناریو را پشتیبانی می کند.

خود شرکت اوراکل نا همزمانی ها پشتیبانی نمی کند و هر گز روش های ASYC را باز گشایی نمی کند آن ها حتی الگوی اولیه و پایانی آن را هم پشتیبانی نمی کنند.

Asynchronous Dispose (C# 8.0)

فرض کنید شما یک برنامه ویندوزی دارید که به یک دیتابیس متصل شده است و شما یک تابعی را شروعی می کنید بعد یک استثنا رخ می دهد و به عقب بر می گردید ممکن است چندین بار به عقب برگردید به این معنی است که رابط کاربری شما منجمد شده است و یا ثابت است می توانید این کار را انجام دهید:

IDbTransaction transaction = null;

try  
{
    transaction = connection.BeginTransaction();

    // do important work

    transaction.Commit();
}
finally  
{
    await Task.Run(() => transaction.Dispose());
}

اما این اساسا هک کردن یک نقص در الگوی یکبار مصرف است. در این مرحله یک ویژگی برای C # 8.0 پیشنهاد شده است که این را بسیار ساده تر می کند.

using await (var transaction = connection.BeginTransaction())  
{
    // do important work

    transaction.Commit();
}

Extension everything (C# 8.0)

شما در سی شارپ می تواند از extention متد ها استفاده کنید در سی شارپ 8 نحوه ی جدیدی را برای تعریف فرمت ها اضافه می کند که به شما امکان می دهد که هر ویژگی را به یک نوع اضافه کنید که در مثال زیر از خواص و نمونه ی استاتیک استفاده شده است

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

این سینتکس به نظر می رسد که مال bit Java-ish dh اما به خاطر داشته باشید که این کد پایانی نیست و امکان دارد که بهبود یابد.

extension Enrollee extends Person  
{
    // static field
    static Dictionary<Person, Professor> enrollees = 
        new Dictionary<Person, Professor>();

    // instance method
    public void Enroll(Professor supervisor) =>
        enrollees[this] = supervisor;

    // instance property
    public Professor Supervisor =>
        enrollees.TryGetValue(this, out var supervisor) 
            ? supervisor
            : null;

    // static property
    public static ICollection<Person> Students => enrollees.Keys;

    // instance constructor
    public Person(string name, Professor supervisor)
        : this(name)
    {
        this.Enroll(supervisor);
    }
}

Records (C# 8.0)

در این ویژگی شما فقط انواع و اسامی فیلد ها را مشخص می کنید این کد بسیار ساده است.

class Person(string First, string Last);  

وقتی که کامپایلر آن را گسترش می دهد همه ی فایل های متنی را لازم نیست پیاده سازی کنید.

class Person: IEquatable<Person>  
{
    public string First { get; }
    public string Last { get; }

    public Person(string First, string Last)
    {
        this.First = First;
        this.Last = Last;
    }

    public void Deconstruct(out string First, out string Last)
    {
        First = this.First;
        Last = this.Last;
    }

    public bool Equals(Person other) =>
        other != null && 
        Equals(First, other.First) && 
        Equals(Last, other.Last);

    public override bool Equals(object other) =>
        (other as Person)?.Equals(this) == true;

    public override int GetHashCode() =>
        (First?.GetHashCode() * 17 + 
         Last?.GetHashCode())
        .GetValueOrDefault();

    public Person With(string First = this.First, 
                       string Last = this.Last) => 
        new Person(First, Last);
}

کد بالا 33 خط کد است که لازم نیست همه ی آن را بنویسید بهترین کد، کدی است که در کم ترین خط نو شته شود.

Default interface implementations (C# 8.0)

در شکل زیر یک interface کامل را مشاهده می کنید:

public interface ILogger  
{
    void Log(LogLevel level, string message);
    void Log(LogLevel level, string format, params obj[] arguments);
    void Debug(string message);
    void Debug(string format, params obj[] arguments);
    void Information(string message);
    void Information(string format, params obj[] arguments);
    void Warning(string message);
    void Warning(string format, params obj[] arguments);
    void Error(string message);
    void Error(string format, params obj[] arguments);
}

در کد بالا یک interface نوشته شده که شامل log-information-error-debug نوشته شده است.

از روش های بالا روش مناسب log(loglevel,string) است.

در حال حاضر به دلیل اینکه یک رابط است پیاده سازی ILogger باید همه روش ها را در رابط کاربری اجرا کند.اگر ما یک روش دیگر اضافه کنیم همه ی آن ها باید تغییر کند تا برنامه اجرا شود.

با پیاده سازی interface ما می توانیم overload هم برای آن پیاده سازی کنیم.

به صورت زیر:

public interface ILogger  
{
    void Log(LogLevel level, string message);

    void Log(LogLevel level, string format, params object[] arguments)
    {
        Log(level, string.Format(format, arguments));
    }

    void Debug(string message)
    {
        Log(LogLevel.Debug, message);
    }

    void Debug(string format, params object[] arguments)
    {
        Log(LogLevel.Debug, string.Format(format, arguments));
    }
}

انواع مرجع Nullable

مفهوم null در سال 1965 در زبان algol w نوشته شده است.

در حال حاضر در زبان سی شارپ با استفاده از این علامت ! خالی یا پر بودن را چک می کنند ولی آیا این کار درست است شاید اصلا آن مقدار خالی نباشد

در سی شارپ 8 از nullable استفاده می کنند و خالی یا پر بودن آن را چک می کنند.

// bar is nullable because its type is string?
void Foo(string? bar)  
{
    string baz = bar; 
    // this will generate a warning because baz is non-nullable 
    // but bar is nullable, and we haven’t checked bar 
    // to not be null
}
void Foo(string? bar)  
{
    if (bar == null)
        throw new ArgumentNullException(nameof(bar));

    string baz = bar; 
}

ماکروسافت در حال حاضر در حال پیشرفت زبان سی شارپ است.

آموزش سی شارپ

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

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

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

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