如何声明C#记录类型?

时间:2017-03-29 23:23:36

标签: c# language-features c#-7.0

我读到on a blog C#7将以记录类型为特色

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

然而,当我尝试它时,我得到了这些错误

  

CS0116命名空间不能直接包含字段或成员等成员   方法
  CS1022类型或命名空间定义,或预期的文件结尾
  CS1514 {预计

这应该如何运作?

6 个答案:

答案 0 :(得分:35)

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

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

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

讨论或投票

答案 1 :(得分:7)

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

引用Mads Torgersen的回复this blog post

  

[主要构造者]仍在关注,以及记录类型的相关概念(我们考虑用于C#7.0),我希望我们能够获得更好的设计 - 也许一个包含两者。

自C#7发布以来,此语言功能的GitHub proposal仍表示实施正在进行中。"

答案 2 :(得分:3)

要添加其他答案,您可以通过查看language milestones轻松跟踪新功能何时进入C#以显示在C#中。计划至少有三个v7.x版本,但现在记录为scheduled for C# 8。因为它也计划用于C#6和C#7,所以用一小撮盐对待这个目标......

答案 3 :(得分:2)

  

在C#7.0之前,你声明这样的类:

虽然C#7.0中尚未实现记录类型(详见其他答案),但可以使用C#6.0中引入的read-only auto-properties来缩短代码:

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;
    }
}

答案 4 :(得分:2)

如果您正在寻找一种类似于记录的懒惰方式来使用当前可用的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);
}

如果要在对性能敏感的情况下使用此功能,请注意一点,因为它是ValueTuple创建和提取的过程。

答案 5 :(得分:2)

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表达式。 with-expression指示编译器创建记录的副本,但是修改了指定的属性:

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

您需要了解有关每个新功能的所有信息,包括记录here