使用C#记录来封装数据以外的对象是否合适?

问题描述 投票:0回答:1

记录非常适合封装数据,但是服务存储库之类的东西呢?与类定义代码相比,属性定义的位置语法更加简洁,因为构造函数、属性和属性初始化代码都是由编译器为我们生成的。

这里有一个人为的例子来演示。目的是用更少的代码行使

RecordService
的依赖关系不可变。在现实场景中,依赖项将由服务容器注入。

namespace RecordsTest;

class MyRepo
{
    public string SomeMethod() => "MyRepo.SomeMethod()";
}

class MyService
{    
    public string SomeMethod() => "MyService.SomeMethod()";
}

record RecordService(MyRepo Repo, MyService Service)
{
    public void SomeMethod() => 
        Console.WriteLine($"RecordService.SomeMethod() {Repo.SomeMethod()} {Service.SomeMethod()}");
}

class Program
{
    static void Main(string[] args)
    {
        var myRepo = new MyRepo();
        var myService = new MyService();

        var recordService = new RecordService(myRepo, myService);
        recordService.SomeMethod();

        Console.ReadKey();
    }
}
c# standards record
1个回答
4
投票

记录提供以下功能(来源

  • 用于创建具有不可变属性的引用类型的简洁语法。[*]
  • 对于以数据为中心的引用类型有用的内置行为:
    • 价值平等
    • 非破坏性突变的简洁语法
    • 内置显示格式
  • 支持继承层次结构

您的示例仅真正受益于构造语法,但这使得声明的属性公开。在编写服务时,这通常不是您想要的。如果您明确指定属性,则使用记录几乎不会获得任何好处。

因此,当您想要描述数据时,我通常建议使用记录,以及服务或其他专注于功能而不是数据的代码的常规类。但我预计在任何一个可能合适的地方都会有一些重叠。

[*]“主构造函数”也可用于 c# 12 / .Net 8 中的类和结构。

© www.soinside.com 2019 - 2024. All rights reserved.