如何声明 C# 记录类型?

How to declare a C# Record Type?

我读到 on a blog C# 7 将具有记录类型

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

然而,当我尝试时,出现了这些错误

CS0116 A namespace cannot directly contain members such as fields or methods
CS1022 Type or namespace definition, or end-of-file expected
CS1514 { expected

这应该如何运作?

更新:这是 C# 9 的一个特性 https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/

更新:

C# 9 now contains record types.

public record Person
{
    public string LastName { get; }
    public string FirstName { get; }

    public Person(string first, string last) => (FirstName, LastName) = (first, last);
}

旧答案:

记录类型(尚未)在 C# 中实现。请参阅官方 GitHub 存储库中的提案:

https://github.com/dotnet/csharplang/blob/master/proposals/records.md

https://github.com/dotnet/csharplang/issues/39

进行讨论或投票

记录类型在 C# 7.0 的路线图上,但最终被推迟到该语言的更高版本。

引用 Mads Torgersen 对 this blog post

的回复

[Primary constructors] are still on the radar, along with the related concept of record types (which we considered for C# 7.0), and I am hopeful that we can land on a better design – maybe one that encompasses both.

截至 C# 7 的发布,此语言功能的 GitHub proposal 仍然表示实现是 "In Progress."

[重写以反映事物的当前状态]

要添加到其他答案中,您可以轻松跟踪这些天 C# 功能何时出现在 C# 中。例如,Champion "Records" 问题显示了围绕记录思考的状态。 Records 现在计划在 C# 9 中使用。但该功能之前也被吹捧为 C# 6、C# 7 和 C# 8,因此它仍然只是一个愿望。

Prior to C# 7.0 you declare classes like this:

虽然记录类型尚未在 C# 7.0 中实现(如其他答案所详述),您 可以 通过使用 read-only auto-properties 来缩短代码,在C# 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;
    }
}

如果您正在寻找 record-like,有一种方法可以使用当前可用的 C# 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);
}

如果您在 performance-sensitive 场景中使用它,请考虑一下,因为它是 ValueTuple 创建和提取的过程。

C#9 现在可用并记录下来。

这里有一些例子:

public record Person
{
    public string LastName { get; init; }
    public string FirstName { get; init; }

    public Person(string first, string last) => (FirstName, LastName) = (first, last);
}

使用位置记录(和继承):

public record Teacher(string FirstName, string LastName,
    string Subject)
    : Person(FirstName, LastName);

public sealed record Student(string FirstName,
    string LastName, int Level)
    : Person(FirstName, LastName);

var person = new Person("Bill", "Wagner");

var (first, last) = person;
Console.WriteLine(first);
Console.WriteLine(last);

最后,记录支持with-expressions。 with-expression 指示编译器创建记录的副本,但修改了指定的属性:

Person brother = person with { FirstName = "Paul" };

关于每项新功能您需要了解的一切,包括记录 here