十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇文章给大家分享的是有关怎么在C#9中将records作为强类型ID,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
成都创新互联公司是一家集网站建设,衡山企业网站建设,衡山品牌网站建设,网站定制,衡山网站建设报价,网络营销,网络优化,衡山网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。实体通常是整数,GUID或者string类型,因为数据库直接支持这些类型,但是,如果实体的ID的类型是一样的,比如都是整数的ID,这有可能会出现ID值传错的问题,看下边的示例。
public void AddProductToOrder(int orderId, int productId, int count) { ... } ... // 这个地方,参数传错了 AddProductToOrder(productId, orderId, int count);
上面的代码可以很好地通过检查并编译,但是在运行的时候就出问题了,这是逻辑bug。
幸运的是,可以定义强类型id来解决这个问题,这个想法很简单,为每个实体的ID声明一个特定的类型,现在需要这样写:
// 使用强类型ID代替整数ID public void AddProductToOrder(OrderId orderId, ProductId productId, int count) { ... } ... // 这个地方,参数传错了 AddProductToOrder(productId, orderId, int count);
在上面的代码中,我们犯了与第一个示例相同的错误(交换productId和orderId),但是在这种情况下,类型不同,因此编译器会捕获该错误并报告错误,我们仍然需要对其进行修复,但是至少在生产中并没有爆炸。
public readonly struct ProductId : IEquatable{ 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重写类型,就是下边这样:
public record ProductId(int Value);
是的,您没看错,这是一行,而上面的代码是一大段,它完成了我们手动执行的所有操作(实际上,还多了很多!)。
主要区别在于:我们的手动实现是struct,即值类型,但是记录是引用类型,这意味着它们可以为null,这可能不是主要问题,尤其是在使用可为空的引用类型的情况下,但是要知道这一点。
以上就是怎么在C#9中将records作为强类型ID,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。