سلام دوستان
کسی میدونه تفاوت های C# 8 با نسخه های قبلی چی هست؟ و اینکه آیا ارزش داره یادش بگیریم یا نه؟
ممنون
سلام اگر میتونید انگلیسی رو بخونید این لینک رو مطالعه کنید کامل نوشته در مورد سی شارپ 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; }
ماکروسافت در حال حاضر در حال پیشرفت زبان سی شارپ است.
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1172
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
618
- پاسخ :
1
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
373
- پاسخ :
1
|
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
335
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
01:58:00 PM
- بازدید :
4294
- پاسخ :
1
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
687
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3192
- پاسخ :
2
|
تاریخ :
1398/09/08
- ساعت :
11:38:00 PM
- بازدید :
3259
- پاسخ :
1
|
تاریخ :
1403/04/12
- ساعت :
07:27:00 PM
- بازدید :
673
- پاسخ :
0
|
تاریخ :
1403/01/29
- ساعت :
08:08:00 AM
- بازدید :
698
- پاسخ :
4
|
تاریخ :
1403/09/06
- ساعت :
09:51:00 PM
- بازدید :
87
- پاسخ :
1
|
تاریخ :
1400/07/17
- ساعت :
10:39:00 PM
- بازدید :
2335
- پاسخ :
0
|
تاریخ :
1403/09/05
- ساعت :
06:32:00 PM
- بازدید :
70
- پاسخ :
1
|
تاریخ :
1401/02/24
- ساعت :
02:17:00 PM
- بازدید :
2037
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
117
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
149
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1067
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
474
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
948
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1378
- پاسخ :
1
|