我读到on a blog C#7将以记录类型为特色
class studentInfo(string StudentFName, string StudentMName, string StudentLName);
然而,当我尝试它时,我得到了这些错误
CS0116命名空间不能直接包含字段或成员等成员 方法
CS1022类型或命名空间定义,或预期的文件结尾
CS1514 {预计
这应该如何运作?
答案 0 :(得分:35)
记录类型尚未在C#中实现。请参阅官方GitHub存储库中的提案:
https://github.com/dotnet/csharplang/blob/master/proposals/records.md
讨论或投票答案 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