我刚刚开始使用 C# 9 和 .NET 5.0,特别是新record
结构。我发现我有很多关于记录类型速记语法的优秀用例。
我考虑过的用例之一是对 ASP.NET Core 应用程序使用record
dto 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# 9 添加了record
类型,这是一种使用基于值的相等性的新引用类型。
C# 10 引入了record struct
用于定义具有与record
( https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/record ) 类似属性的值类型的语法。
创建一个类型的值类型版本似乎很不寻常,该类型被创建为具有基于值的相等性的引用类型 - 这肯定会消除使用该类型的大部分好处。
你为什么要声明 a record struct
?
我还缺少什么吗?
我最近发现了C# 中的关键字,并且发现如果我理解正确的话,record
它可以用作值类型而不是引用类型。record struct
但是,我很难理解何时确切使用而record struct
不仅仅是struct
. 据我所知,record struct
具有一些结构没有的基本实现(例如==
and!=
运算符、对 的重写ToString
以及其他一些东西),但这就是两者之间的区别吗?如果不是,在决定使用其中一种时需要考虑什么?
从我目前看到的方式来看,最好始终使用record struct
just 来利用它已经附带的那些实现。
C#9几天前正式宣布,该语言最大的新增功能之一是使用data
关键字的新“记录”类型。这个新功能感觉与C#7.2的只读结构非常相似,所以我很困惑为什么要使用一个而不是另一个。具体来说:
data struct
over a readonly struct
?这些不完全一样吗?data readonly struct
吗?那不会是多余的吗?data class
over a readonly struct
?它们都实现了不变性和值类型相等,所以这只是一个性能问题(堆分配与作为参数传递时的复制)?加分点:我可以使用一些帮助来理解为什么“记录更改了简单成员声明......意味着什么的默认值”?我已经使用了足够多的企业代码来预测具有数十个成员的巨型数据类,没有经验的程序员会看到string FirstName;
并且不会考虑向上滚动以查找data
关键字,假设它是一个私有字段,而不是一个可公开访问的属性!
c# ×4
c#-9.0 ×3
c#-10.0 ×2
copy ×1
deep-copy ×1
immutability ×1
record ×1
shallow-copy ×1
struct ×1
types ×1