How to declare a C# Record Type?

断了今生、忘了曾经 提交于 2019-12-21 03:13:09

问题


I read on a blog that C# 7 will feature record types

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

However when I tried it, I get these errors

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

How is this supposed to work?


回答1:


Record types are not (yet) implemented in C#. See the proposal in the official GitHub repository:

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

Discuss or vote at https://github.com/dotnet/csharplang/issues/39




回答2:


Record types were on the roadmap for C# 7.0, but were ultimately delayed until a later version of the language.

To quote Mads Torgersen in reply to 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.

As of C# 7's release, the GitHub proposal for this language feature still indicates that the implementation is "In Progress."




回答3:


[Rewritten to reflect the current state of things]

To add to the other answers, you can easily track when C# features are pencilled in to appear in C# these days. For example, the Champion "Records" issue shows the state of thinking around records. Records is now scheduled for C# 9. But that feature was previously touted for C# 6, C# 7 and C# 8 too, so it remains only an aspiration.




回答4:


Prior to C# 7.0 you declare classes like this:

Although record types have not been implemented yet in C# 7.0 (as detailed by the other answers), you can shorten your code by using read-only auto-properties, introduced in 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;
    }
}



回答5:


There is a way if you're looking for record-like, lazy way of implementing constructors using currently available C# 7 functionality:

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

A bit of consideration if you're using this on a performance-sensitive scenario, as it's a process of ValueTuple creation and extraction.



来源:https://stackoverflow.com/questions/43105895/how-to-declare-a-c-sharp-record-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!