Как объявить тип записи С#?

Я читал в блоге, что С# 7 будет иметь типы записей

class studentInfo(string StudentFName, string StudentMName, string StudentLName);

Однако, когда я попробовал это, я получаю эти ошибки

CS0116 Пространство имен не может напрямую содержать элементы, такие как поля или методы
CS1022 Тип или определение пространства имен или ожидаемый конец файла
CS1514 {ожидается

Как это должно работать?

Ответы

Ответ 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.