Как объявить тип записи С#?
Я читал в блоге, что С# 7 будет иметь типы записей
class studentInfo(string StudentFName, string StudentMName, string StudentLName);
Однако, когда я попробовал это, я получаю эти ошибки
CS0116 Пространство имен не может напрямую содержать элементы, такие как поля или методы
CS1022 Тип или определение пространства имен или ожидаемый конец файла
CS1514 {ожидается
Как это должно работать?
Ответы
Ответ 1
Типы записей (пока) не реализованы в С#. Смотрите предложение в официальном репозитории GitHub:
https://github.com/dotnet/csharplang/blob/master/proposals/records.md
Обсудить или проголосовать по адресу https://github.com/dotnet/csharplang/issues/39.
Ответ 2
Типы записей были включены в дорожную карту для С# 7.0, но в конечном счете были отложены до более поздней версии языка.
Чтобы процитировать Mads Torgersen в ответ на этот пост в блоге,
[Первичные конструкторы] по-прежнему находятся на радаре вместе со связанной концепцией типов записей (которые мы рассмотрели для С# 7.0), и я надеюсь, что мы сможем приземлиться на лучший дизайн - возможно, тот, который охватывает оба.
Начиная с выпуска С# 7, предложение GitHub для этой языковой функции все еще указывает на то, что реализация является "In Progress".
Ответ 3
Чтобы добавить к другим ответам, вы можете легко отслеживать, когда новые функции карандашом отображаются, чтобы появиться на С# в эти дни, просмотрев языковые этапы. Планируется, по крайней мере, три релиза v7.x, но теперь записи запланированы на С# 8. Поскольку это было запланировано и для С# 6 и С# 7, обработайте эту цель щепоткой соли...
Ответ 4
До С# 7.0 вы объявляете классы так:
Хотя типы записей еще не были реализованы в С# 7.0 (как подробно описано в других ответах), вы можете сократить свой код, используя автоматические свойства только для чтения, представленные в С# 6.0:
public class studentInfo
{
public string StudentFName { get; }
public string StudentMName { get; }
public string StudentLName { get; }
public studentInfo(string strFN, string strMN, string strLN)
{
StudentFName = strFN;
StudentMName = strMN;
StudentLName = strLN;
}
}
Ответ 5
Есть способ, если вы ищете ленивый способ реализации конструкторов с использованием доступных в настоящее время функций С# 7:
class Lazystructor
{
int a;
float b;
WebClient c;
public Lazystructor(int a, float b, WebClient c)
=> (this.a, this.b, this.c) = (a, b, c);
}
Немного подумайте, если вы используете это в чувствительном к производительности сценарии, так как это процесс создания и извлечения ValueTuple.