Comments 14
Глобальные псевдонимы: возможность «называть» кортеж и использовать их во всей сборке (****).
А как насчет этой новой фичи C# под названием класс?
Классы и туплы совершенно разные вещи. Тупл это неизменяемый* value type, со структурным сравнением. Класс по умолчанию бесполезен. Он может быть null, ему нужно определить десяток методов, что-бы нормально сравнивать, и что не маловажно, постоянно следить за релевантностью этих методов. Его легко сломать, и уронить программу через тысячу строк после бага. Класс это инструмент для конкретных задач. Просто исторически его используют для всех гвоздей.
Не нужен null? Тогда struct
.
Глобальные псевдонимы: возможность «называть» кортеж и использовать их во всей сборке (****).
Здесь будет большой минус в том, что потеряется строгая типизация.
То есть если объявить два типа: CartesianCoordinates = (float x, float y) и PolarCoordinates = (float r, float arg), то они будут неявно преобразуемы друг к другу, и это повысит риск ошибки.
Лучше уж действительно подождать record-ы, надеясь, что сделают и class, и struct варианты.
Разбор кортежа в сопоставлении с образцом: в out var и в case var .
Да, очень не хватает этого.
Использование оператор == для сравнения равенства.
А вот с этим, боюсь, будет сложнее. Во-первых, это будет обновление, ломающее существующий код.
А во-вторых, для generic типов оператор == не может быть применён. То есть сравнение элементов ValueTuple с помощью == реализовать будет нельзя, только через Equals. А вот для record — вполне можно.
А вот с этим, боюсь, будет сложнее. Во-первых, это будет обновление, ломающее существующий код.
Каким образом?
То есть сравнение элементов ValueTuple с помощью == реализовать будет нельзя, только через Equals.
Зачем сравнивать элементы через оператор? Внутри == пусть все через Equals будет.
(комментарий был удален)
По делу в моих тестах ValueTuple это аналог struct с имплементированными IEquatable/IComparable. Юз кейсы у них соответственно такие же, просто не надо писать эти 10-15 строк кода с объявлением структуры, но за это теряете возможность именовать этот кортеж.
Поэтому я сошелся на том, что для private implementation методов ок, для public будьте добры структуру. Во многом по причине текущего тулинга — прайват методы в одном файле обычно и можно глазами найти что как где используется, find all references же на кортеже не работает, поэтому найти другие зависимые классы будет сложнее. Ну и в целом когда я вижу чужой интерфейс который мне возвращает x,y,z или даже что-нить более бизнесовое типа cost,weight первый возникающий вопрос — что конкретно это сочетание значений значит, где имя структуры/класса?
Собственно это видно и в коде тут github.com/dotnet/corefx/blob/master/src/System.ValueTuple/src/System/ValueTuple/ValueTuple.cs
Исследование кортежей в C# 7