Friday, December 13, 2013

Возможности C# 6.0

Эта статья посвящена новым возможностям будущего языка C# 6.0. Часть информации для данной статьи взята с источников и блогов, которые посвящены презентациям конференции NDC 2013 (new Developers Conference), проходившей с 2 по 6 декабря в Лондоне. В этой конференции Mads Torgersen презентовал новые возможности языка C# 6.0. В последние годы команда Microsoft была сосредоточена на написании компилятора нового поколения в рамках проекта Roslyn, который Вы можете попробовать в действии уже сейчас.

1. Конструктор по умолчанию (Primary Constructor)
В новой версии языка вызов конструктора по умолчанию будет выглядеть намного проще.  
До нововведения:
public class Point
{
    private int _x, _y;

    public Point(int x, int y)
    {
        _x = x;
        _y = y;
    }
}
После нововведения:
public class Point(int x, int y)
{
    private int _x = x;
    private int _y = y;
}

2. Неизменяемые автопроперти (Read only auto properties)
До нововведения:
private readonly int _x;
public int X { get { return _x; } }
После нововведения:
public int X { get; } = _x;

3. Использование using для статических типов (static type using statment)
До нововведения:
public double A { get { return Math.Sqrt(Math.Round(5.142)); } }
После нововведения:
using System.Math;
public double A { get { return Sqrt(Round (5.142)); } }

4. Property Expression
Для свойств в новой версии С# добавлена инициализация get и set метода с помощью лямбда-выражения. Как это будет выглядеть, можно посмотреть в примере.
До нововведения:
public double Distance
{
    get { return Math.Sqrt((X * X) + (Y * Y)); }
}
После нововведения:
public double Distance => Math. Sqrt((X * X) + (Y * Y));

5. Method Expression
Аналогичную возможность сделали также для методов.
До нововведения:
public Point Move(int dx, int dy)
{
    return new Point(X + dx1, Y + dy1);
}
После нововведения:
public Point Move(int dx, int dy) => Point(X + dx1, Y + dy1);

6. Использование params для коллекций (params for enumerables)
Как по мне, это очень специфическая возможность. Да, она позволяет не приводить Вашу коллекцию к массиву. Но в чем сложность принимать коллекцию для написанных методов вместо params? К сожалению, не вижу здесь преимуществ использования.
До нововведения:
Do(array.ToArray());
public void Do(params int[] values)
{  }
После нововведения:
Do(array);
public void Do(params IEnumerable<int> values)
{  }

7. Проверка на null с помощью монад (Monadic null checking)
Команда разработчиков решила реализовать возможность языка на замену монады Maybe, которая очень популярна в функциональном программировании. Вы можете посмотреть варианты решения с помощью linq, доступные на данный момент. 
До нововведения:
if (points != null)
{
    var next = points.FirstOrDefault();
    if (next != null && next.X != null) return next.X;
}  
return -1;
После нововведения:
var bestValue = points?.FirstOrDefault();?.X ?? -1;

8. Сonstructor type parameter inference
Удаляет необходимость создания статических фабричных методов и вместо них позволяет использовать дженерик тип (generic type). Примером может служить кортеж (Tuple) с его методом Tuple.Create.
До нововведения:
var t = new Tuple<int, int>(1, 2);
После нововведения:
var t = new Tuple(1, 2);
Аналог, используемый сейчас:
var s= Tuple.Create(1, 2);

9. Встроенное объявление для выходных параметров (inline declarations for out params)
До нововведения:
int x;
int.TryParse("123", out x);
После нововведения:
int.TryParse("123", out int x);

Итоги
В данной статье были анонсированы новости с конференции NDC. Стоит упомянуть также об возможностях, которые не были указаны в данной конференции, но были объявлены в видео с Андерсом Хейлсбергом (возглавляет группу по проектированию и созданию языка C#) What is new in C# 6.0. В этом видео Андерс Хейлсберг упоминал об использовании TypeScript языка для более удобной работы с JavaScript в .Net. О возможностях данного языка можно ознакомится в статье Более комфортная работа с JavaScript в .NET. Также упоминалось о том, что язык C# все больше переходит в сторону использования тасков и расширения возможностей для использования linq. Меня немного смущает тот факт, что я ничего не слышал о том, войдут ли Immutable Collections, которые сейчас доступны в предварительной версии, в основу языка C# 6.0 или нет. Надеюсь, авторы, материалы блогов которых были использованы как источник, не рассердятся на меня из-за столь вольного перевода их труда с добавлением своих мыслей и идей.

Источники:

No comments:

Post a Comment