Компанія 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();
}