+38(044) 277-40-42
+38(063) 233-01-83
+38(095) 628-11-32
Войти
+38(044) 277-42-05
+38(063) 233-01-83
+38(095) 628-11-32

Новинки C# 6.0

 
Компанія Microsoft випустила версію Visual Studio 2015, .Net Framework 4.6 і C#6.0 20 липня 2015. Було введено наступні нововведення до C# 6.0:
1. Інтерполяція стрічок
//Раніше
public string OldYearFormat = string.Format("Today is {0} year", DateTime.Now.Year);
//Зараз
public string NewYearFormat = $"Today is {DateTime.Now.Year} year";
2. Ініціалізація властивостей зі значеннями по замовчуванню
         Задати значення для властивостей можна, написавши справа від них їх значення по замовчуванню. Цим ми можемо уникнути помилки з пустими значеннями, якщо користувач раніше їх ніде не присвоїв.
//Раніше
public int Id { get; set;}
public bool IsOwner { get; set;}
//Зараз
public int NewId { get; set;} = 1001;
public bool NewIsOwner { get; set;} = true;
         Це ж саме можна використати для властивостей лише для читання
public class Example {
       public List<string> Values { get;} = new List<string>();
}
3. Використання лямда-виразів
//Раніше
public int nextYear {
       get { return DateTime.Now.Year + 1;}
}
public string printNewYear() {
       return string.Format("Next year number  will be {0}", DateTime.Now.Year + 1);
}
public int calculateNextYear(int currentYearNumber) {
       return currentYearNumber + 1;
}
//Зараз
public int NextYear => DateTime.Now.Year + 1;
public string PrintNextYear() => $"Next year number will be {DateTime.Now.Year + 1}";
public int CalculateNextYear(int currentYearNumber) => currentYearNumber + 1;
4. Null-умовний оператор (?.)
         Нехай користувач має модель наступного вигляду
public class Pigeon {
       public int Id { get; set;}
       public string RingNumber { get; set;}
       public int BirthYear { get; set;}
}
public class Owner {
       public string Name { get; set;}
       public ICollection<Pigeon> Pigeons { get; set;}
}
public class Organization {
       public string Name { get; set;}
       public DateTime CreatedTime { get; set;}
       public List<Owner> Owners;
}
         Тоді подивимося, які можливості дає оператор перевірки на null
//Раніше
public class Test1 {
       public Organization org = new Organization();
       public int GetOwnerPigeonsCount(string ownerName) {
             int count = 0;
             if (org.Owners != null &&
                  org.Owners.FirstOrDefault(ow => ow.Name == ownerName) != null &&
                  org.Owners.FirstOrDefault(ow => ow.Name == ownerName).Pigeons != null)
             {
             count = org.Owners.FirstOrDefault(ow => ow.Name == ownerName).Pigeons.Count;
}
return count;
}
}
//Зараз
public class Test2 {
public Organization org = new Organization();
public int GetOwnerPigeonsCount(string ownerName) => org.Owner?.FirstOrDefault(ow => ow.Name == ownerName)?.Pigeons.Count ?? 0;
}
5.  Імпорт статичних класів в простір імен
         Тепер, щоб викликати статичний метод не обов’язково вказувати Namespace
//Раніше
public double CalculateSqrtOld(double value) {
       return Math.Sqrt(value);
}
//Зараз
using static System.Math;
public double CalculateSqrtNew(double value) => Sqrt(value);
6. Оператор nameof - дає змогу отримати ім’я класу чи властивості
static void Main(string[] args) {
Pigeon pigeon = new Pigeon() {
BirthYear = 2013,
Id = 1,
RingNumber = "UA 123456"
};
Console.WriteLine(pigeon.RingNumber); //return UA 123456
Console.WriteLine(nameof(pigeon.RingNumber)); //return RingNumber
Console.WriteLine(nameof(Pigeon.RingNumber)); //return RingNumber
Console.ReadKey();
}
Console.WriteLine(nameof(person.Address.Street); // return Street
7. Ініціалізація індексів – дає змогу вказувати індекси при ініціалізації
var pigeonList = new List<Pigeon> {
[3] = new Pigeon(),
[5] = new Pigeon()
};
var dictionary = new Dictionary<int, string> {
[2]  = "two",
[5] = "five"
};
8. Фільтри виключень - додають умови, при яких спрацьовує блок catch()
Owner owner = new Owner() [
Name = "Kostyantyn",
Pigeons = null
};
try {
Console.WriteLine(owner.Pigeons.Count);
}
catch (Exception ex) when (ex is NullReferenceException) {
Console.WriteLine(nameof(NullReferenceException));
}
9. Await в блоках catch/finally
         Раніше не можна було використовувати асинхронні функції в блоках catch & finally. Тепер це дає змогу використовувати їх для звільнення ресурсів чи ведення логів про помилки
WebClient wc = new WebClient();
string result;
try {
result = wc.DownloadString(new Uri("http://kpi.in.ua"));
}
catch {
await wc.DownloadDataTaskAsync(new Uri("http://kpi.in.ua"));
}
finally {
wc.CancelAsync();
}