Когда использовать записи C#9

C#9 был официально анонсирован пару дней назад, и одним из самых больших дополнений к языку является новый тип «запись», использующий ключевое слово data. Эта новая функция очень похожа на структуры только для чтения C# 7.2, поэтому я не понимаю, почему можно использовать одну над другой. Конкретно:

  1. Зачем использовать data struct вместо readonly struct? Разве это не одно и то же?
  2. Можно ли объявить data readonly struct? Не будет ли это излишним?
  3. Зачем использовать data class вместо readonly struct? Они оба обеспечивают неизменность и равенство типов значений, так что это просто вопрос производительности (выделение кучи или копирование при передаче в качестве параметра)?

Бонусные баллы: мне не помешала бы помощь в понимании того, почему «записи изменяют значения по умолчанию того, что означает простое объявление члена...»? У меня было достаточно корпоративного кода, чтобы предвидеть гигантские классы данных с десятками членов, где неопытный программист увидит string FirstName; и не подумает прокрутить вверх, чтобы найти ключевое слово data, предполагая, что это частное поле, а не общедоступное свойство. !


person Rabadash8820    schedule 21.05.2020    source источник
comment
Что касается #3, data class поддерживает наследование, а readonly struct - нет. Если data classes имеют аналогичное поведение производительности и размещаются в стеке, как структуры, но имеют наследование, то я хочу, чтобы они имели строго типизированные варианты структур (подумайте о векторах в разных системах отсчета).   -  person lamont    schedule 24.05.2020
comment
Почему бы не сделать структуры наследуемыми вместо добавления в язык всего нового обитателя? Я также хочу знать мнение разработчиков, так что, может быть, OP следует вставить это в Reddit, видя, что StackOverflow не хочет разрешать этот вопрос?   -  person Robert Synoradzki    schedule 06.06.2020
comment
#1: Да, давайте проигнорируем весь новый синтаксис, который применяется ТОЛЬКО к записям данных ;)   -  person TomTom    schedule 12.06.2020
comment
Пока они на самом деле не выпустят C# 9, я бы не воспринимал никакие объявления иначе, как мы надеемся. Они анонсировали много вещей для C# 7 и 8, которые так и не были выпущены, некоторые из них есть в этом анонсе C# 9. Так что прости меня за то, что я не задержал дыхание.   -  person Lasse V. Karlsen    schedule 12.06.2020
comment
@lamont Хороший вопрос о наследовании. Я предполагаю, что записи не будут размещены в стеке, потому что они являются классами, но тогда я понятия не имею. Надеюсь, MS предоставит некоторые рекомендации о том, какое объявление должно быть предпочтительным по умолчанию для неизменяемых данных, вроде того, как они рекомендовал использовать классы вместо структур.   -  person Rabadash8820    schedule 12.06.2020
comment
Посмотрите мой ответ здесь   -  person KUTlime    schedule 24.02.2021