web-dev-qa-db-ja.com

C#レコードタイプを宣言する方法は?

私は ブログで を読んだ

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

しかし、私がそれを試したとき、私はこれらのエラーを受け取ります

CS0116名前空間には、フィールドやメソッドなどのメンバーを直接含めることはできません
CS1022タイプまたは名前空間の定義、またはファイルの終わりが必要です
CS1514 {予想

これはどのように機能するはずですか?

24
Jeremy Thompson

レコードタイプは(まだ)C#に実装されていません。公式のGitHubリポジトリで提案を参照してください。

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

https://github.com/dotnet/csharplang/issues/39 で議論または投票する

36
DavidG

レコードタイプはC#7.0のロードマップにありましたが、最終的には言語の新しいバージョンまで延期されました。

このブログ投稿 への返信でMads Torgersenを引用するには、

[Primary constructors]はまだ注目されています関連するレコードタイプの概念(C#7.0で検討しました)。両方を含む。

C#7のリリース時点では、この言語機能の GitHub提案 は、実装が「進行中」であることを示しています。

8
BJ Myers

[物事の現在の状態を反映するように書き換えられました]

他の回答に追加するために、C#の機能が最近C#に表示されるようにペンシルインされる時期を簡単に追跡できます。たとえば、 Champion "Records" の問題は、レコードに関する思考の状態を示します。レコードは現在C#9でスケジュールされていますが、その機能は以前C#6、C#7、C#8でも宣伝されていたため、あくまでも野望です。

4
David Arno

現在利用可能なC#7機能を使用してコンストラクターを実装するレコードのような怠laな方法を探している場合は、方法があります。

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の作成と抽出のプロセスであるため、パフォーマンスに敏感なシナリオでこれを使用している場合、少し考慮します。

3

C#7.0より前は、次のようなクラスを宣言します。

レコードタイプはまだC#7.0に実装されていませんが(他の回答で詳しく説明しています)、canread-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;
    }
}
3
Heinzi