Pull to refresh

Comments 14

Глобальные псевдонимы: возможность «называть» кортеж и использовать их во всей сборке (****).

А как насчет этой новой фичи C# под названием класс?

Классы и туплы совершенно разные вещи. Тупл это неизменяемый* value type, со структурным сравнением. Класс по умолчанию бесполезен. Он может быть null, ему нужно определить десяток методов, что-бы нормально сравнивать, и что не маловажно, постоянно следить за релевантностью этих методов. Его легко сломать, и уронить программу через тысячу строк после бага. Класс это инструмент для конкретных задач. Просто исторически его используют для всех гвоздей.

У struct'а нет оператора сравнения, он изменяемый, обладает обязательным публичным пустым конструктором и без дополнительных действий большой struct медленный.

Сейчас посмотрел, туплы реализованы через 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 будет.

Так нелогично же. Зачем тогда вообще нужен этот оператор, если есть 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
Два вида таплов — не очень красиво. лучше б сразу рекорды запилили.
Почему «тапл»? Лучше уж использовать «кортеж», чем так коверкать английский.
Sign up to leave a comment.

Articles