时间:2021-01-17来源:www.pcxitongcheng.com作者:电脑系统城
实体通常是整数,GUID或者string类型,因为数据库直接支持这些类型,但是,如果实体的ID的类型是一样的,比如都是整数的ID,这有可能会出现ID值传错的问题,看下边的示例。
1 2 3 4 5 6 7 8 9 |
public void AddProductToOrder( int orderId, int productId, int count) { ... } ... // 这个地方,参数传错了 AddProductToOrder(productId, orderId, int count); |
上面的代码可以很好地通过检查并编译,但是在运行的时候就出问题了,这是逻辑bug。
幸运的是,可以定义强类型id来解决这个问题,这个想法很简单,为每个实体的ID声明一个特定的类型,现在需要这样写:
1 2 3 4 5 6 7 8 9 10 |
// 使用强类型ID代替整数ID public void AddProductToOrder(OrderId orderId, ProductId productId, int count) { ... } ... // 这个地方,参数传错了 AddProductToOrder(productId, orderId, int count); |
在上面的代码中,我们犯了与第一个示例相同的错误(交换productId和orderId),但是在这种情况下,类型不同,因此编译器会捕获该错误并报告错误,我们仍然需要对其进行修复,但是至少在生产中并没有爆炸。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public readonly struct ProductId : IEquatable<ProductId> { public ProductId( int value) { Value = value; } public int Value { get ; } public bool Equals(ProductId other) => other.Value == Value; public override bool Equals( object obj) => obj is ProductId other && Equals(other); public override int GetHashCode() => Value.GetHashCode(); public override string ToString() => $ "ProductId {Value}" ; public static bool operator ==(ProductId a, ProductId b) => a.Equals(b); public static bool operator !=(ProductId a, ProductId b) => !a.Equals(b); } |
上面的代码没什么难的,但是如果每个实体都需要的话,那确实有点麻烦,在C# 9 可以使用source generators来完成这些,但是C# 9还引入了另一个功能,使用起来更方便。
Record 类型是具有内置不变性和值语义的引用类型,它和上面我们写的强类型是一样的(手动写的成员实现Equals,GetHashCode等等),在代码中使用也非常简洁, 如果我们ProductId使用record重写类型,就是下边这样:
1 | public record ProductId( int Value); |
是的,您没看错,这是一行,而上面的代码是一大段,它完成了我们手动执行的所有操作(实际上,还多了很多!)。
主要区别在于:我们的手动实现是struct,即值类型,但是记录是引用类型,这意味着它们可以为null,这可能不是主要问题,尤其是在使用可为空的引用类型的情况下,但是要知道这一点。
现在为模型中的每个实体编写一个强类型的id是不是很简单,使用Record 非常方便,当然,还有其他问题需要考虑,例如JSON序列化,与Entity Framework Core一起使用等,但这是另一篇文章的故事!
到此这篇关于使用C#9中records作为强类型ID的文章就介绍到这了,更多相关C#9 records作强类型ID内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
2023-07-08
win10系统任务栏颜色透明怎么更改教程2023-07-05
台式电脑音箱没有声音怎么解决 新买的音响插电脑上没声音怎么设置2023-07-05
miui15系统怎么彻底删除垃圾文件教程最近有很多小伙伴在使用联想笔记本的时候出现了问题,说自己不小心把联想笔记本键盘锁住了,想要解开却不知道联想笔记本键盘锁了怎么解开,不要着急,万能的系统城小编为大家整理好了win10键盘被锁住按什么键恢复的方法,下面...
2023-07-03
很多用户在使用电脑时候会遇到耳机插到电脑上,但是却没有声音的现象,很多小伙伴不知道遇到这一问题该如何解决,其实出现这种情况原因有很多,比如插口问题、设置问题等等,下面和小编一起来看看具体的解决办法吧~...
2023-06-01