服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 使用C#9中records作为强类型ID的实例教程

使用C#9中records作为强类型ID的实例教程

2022-10-28 12:24SpringLeee C#

这篇文章主要给大家介绍了关于使用C#9中records作为强类型ID的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

强类型ID

实体通常是整数,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),但是在这种情况下,类型不同,因此编译器会捕获该错误并报告错误,我们仍然需要对其进行修复,但是至少在生产中并没有爆炸。

编写一个强类型的id

?
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类型

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内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文作者: thomas levesque

原文链接:https://thomaslevesque.com/2020/10/30/using-csharp-9-records-as-strongly-typed-ids/

原文链接:https://www.cnblogs.com/myshowtime/p/14285550.html

延伸 · 阅读

精彩推荐
  • C#C#多线程传递参数及任务用法示例

    C#多线程传递参数及任务用法示例

    这篇文章主要介绍了C#多线程传递参数及任务用法,结合简单实例形式分析了C#多线程的使用及相关的参数传递与任务创建等使用技巧,需要的朋友可以参考下...

    smartsmile201210682021-11-25
  • C#C# double类型变量比较分析

    C# double类型变量比较分析

    这篇文章主要介绍了C# double类型变量比较分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    川master9692022-10-21
  • C#C# 以MDF文件链接数据库的示例代码

    C# 以MDF文件链接数据库的示例代码

    本篇文章主要介绍了C# 以MDF文件链接数据库的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    hotmee6842022-01-21
  • C#Unity通过UGUI的Slider调整物体颜色

    Unity通过UGUI的Slider调整物体颜色

    这篇文章主要为大家详细介绍了Unity通过UGUI的Slider调整物体颜色,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    这个世界会好吗6102022-03-11
  • C#完美解决c# distinct不好用的问题

    完美解决c# distinct不好用的问题

    这篇文章主要介绍了完美解决c# distinct不好用的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    萌橙10172022-10-20
  • C#C#通过html调用WinForm的方法

    C#通过html调用WinForm的方法

    这篇文章主要介绍了C#通过html调用WinForm的方法,涉及html页面中使用JavaScript访问C#的相关技巧,需要的朋友可以参考下...

    且行且思8162021-11-18
  • C#C#异常捕获机制图文详解

    C#异常捕获机制图文详解

    在本文中我们给大家分享了关于C#异常捕获机制的相关知识点内容,有兴趣的朋友们学习下。...

    C#教程网4152022-07-07
  • C#MVC设定默认路由为指定的Area下的某个action

    MVC设定默认路由为指定的Area下的某个action

    今天小编就为大家分享一篇关于MVC设定默认路由为指定的Area下的某个action,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一...

    chenqiangdage7152022-03-08