دسته بندی ها
00:21 1398/07/08

تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟

مشخصات سوال کننده :
کاربر : fateme     امتیاز کاربر : 1617     رتبه کاربر : 2
دسته بندی : سی شارپ

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 3308
پاسخ دهنده : hamdola 23:24 1398/07/26

سلام اگر میتونید انگلیسی رو بخونید این لینک رو مطالعه کنید کامل نوشته در مورد سی شارپ 8 و بهبودهایی که داشته.

به این پاسخ امتیاز بدهید    1
امتیاز: 121 رتبه: 12
پاسخ دهنده : motlagh_2000 23:24 1398/07/26

ویژگی های سی شارپ 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; 
}

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

 

منبع https://barnamenevisan.org/Articles/Article6261.html

ویرایش شده در پنج شنبه 21 اسفند 1399 ساعت 11:49:06
به این پاسخ امتیاز بدهید    5
امتیاز: 179 رتبه: 8
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود