如何声明 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
进行讨论或投票
记录类型在 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
我读到 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
进行讨论或投票记录类型在 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