c# - 为什么 Uri 是类而不是结构?
问题描述
System.Uri
似乎是成为 a 的完美候选人,struct
但微软的好人决定将其设为class
. 它显然是一个值对象 -> 有两个不同的“ https://stackoverflow.com ”实例是没有意义的,因此它具有 struct-y 相等规则。我在公共 API 上也看不到任何设置器,因此它是不可变的。
是否有一些实现细节表明它必须是一个class
?
解决方案
Astruct
总是有一个默认构造函数(所有字段都将被初始化为其默认值)。例如,这可能会导致一些内部字段出现问题。
一个例子是现有的构造函数确保不能m_String
为空 - https://referencesource.microsoft.com/#system/net/system/UriExt.cs,39。如果将其设为结构,则无法在 C# 中轻松实现。因此,在您阅读的任何地方都m_String
需要添加一个null
检查(如果它是一个类,则不需要)。
此外,正如其他人指出的那样,文档对选择何时使用还有其他指导struct
:
✓ 如果类型的实例很小且通常短暂存在或通常嵌入在其他对象中,请考虑定义结构而不是类。
X 避免定义结构,除非该类型具有以下所有特征:
它在逻辑上表示单个值,类似于原始类型(int、double 等)。
它的实例大小小于 16 个字节。
它是不可变的。
它不必经常装箱。
特别是 16 字节的要求可能对Uri
.