相关疑难解决方法(0)

754
推荐指数
22
解决办法
55万
查看次数

我可以使用 C# 9 记录作为 IOptions 吗?

我刚刚开始使用 C# 9 和 .NET 5.0,特别是新record结构。我发现我有很多关于记录类型速记语法的优秀用例。

我考虑过的用例之一是对 ASP.NET Core 应用程序使用recorddto in IOptions<>,而不是常规类。这些选项类通常很简单,所以我认为它非常适合,但似乎我不能让它轻松工作,因为使用配置应用程序IOptions<>需要对象具有无参数构造函数。

public record MyOptions(string OptionA, int OptionB);

public class Startup
{
    public void ConfigureServices(IServiceCollection services) {
        services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));
    }
...
}

public class MyController : Controller 
{
    private readonly MyOptions _options;
    public MyController(IOptions<MyOptions> options) {
        _options = options.Value;  // This throws an exception at runtime
    }
}

Run Code Online (Sandbox Code Playgroud)

上面的示例在尝试访问该IOption<>.Value属性时抛出以下异常:

System.MissingMethodException: '没有为类型 'AcmeSolution.MyOptions' 定义无参数构造函数。

有没有办法配置IOptions配置系统以使用记录的构造函数反序列化选项,而不是需要无参数的构造函数?

我可以对记录使用普通语法,但是使用类确实没有任何好处。

c# record c#-9.0

13
推荐指数
2
解决办法
1186
查看次数

记录结构的目的是什么?

C# 9 添加了record类型,这是一种使用基于值的相等性的新引用类型。

C# 10 引入了record struct用于定义具有与record( https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/record ) 类似属性的值类型的语法。

创建一个类型的值类型版本似乎很不寻常,该类型被创建为具有基于值的相等性的引用类型 - 这肯定会消除使用该类型的大部分好处。

你为什么要声明 a record struct

我还缺少什么吗?

c# types language-concepts c#-10.0

13
推荐指数
1
解决办法
5693
查看次数

何时使用记录结构而不是结构,反之亦然?

我最近发现了C# 中的关键字,并且发现如果我理解正确的话,record它可以用作值类型而不是引用类型。record struct

但是,我很难理解何时确切使用而record struct不仅仅是struct. 据我所知,record struct具有一些结构没有的基本实现(例如==and!=运算符、对 的重写ToString以及其他一些东西),但这就是两者之间的区别吗?如果不是,在决定使用其中一种时需要考虑什么?

从我目前看到的方式来看,最好始终使用record structjust 来利用它已经附带的那些实现。

c# struct c#-9.0 c#-record-type c#-10.0

12
推荐指数
1
解决办法
3626
查看次数

何时使用 C#9 记录

C#9几天前正式宣布,该语言最大的新增功能之一是使用data关键字的新“记录”类型。这个新功能感觉与C#7.2的只读结构非常相似,所以我很困惑为什么要使用一个而不是另一个。具体来说:

  1. 为什么要使用 a data structover a readonly struct?这些不完全一样吗?
  2. 可以声明一个data readonly struct吗?那不会是多余的吗?
  3. 为什么要使用 a data classover a readonly struct?它们都实现了不变性和值类型相等,所以这只是一个性能问题(堆分配与作为参数传递时的复制)?

加分点:我可以使用一些帮助来理解为什么“记录更改了简单成员声明......意味着什么的默认值”?我已经使用了足够多的企业代码来预测具有数十个成员的巨型数据类,没有经验的程序员会看到string FirstName;并且不会考虑向上滚动以查找data关键字,假设它是一个私有字段,而不是一个可公开访问的属性!

c# language-design immutability c#-9.0 c#-record-type

6
推荐指数
0
解决办法
2932
查看次数