System.Uri
似乎很适合成为struct
的候选人,但Microsoft的好伙伴决定将其设为class
。显然,它是一个值对象->具有两个不同的“ https://stackoverflow.com” 实例是没有意义的,因此它具有结构相等的规则。我在公共API上也看不到任何设置器,所以它是不可变的。
是否有一些实现细节规定它必须为class
?
答案 0 :(得分:4)
struct
始终具有默认构造函数(所有字段都将初始化为它们的默认值)。例如,这可能会导致某些内部字段出现问题。
一个示例是现有的构造函数确保 m_String
不能为null-https://referencesource.microsoft.com/#system/net/system/UriExt.cs,39。如果将其作为结构,则无法在C#中轻松实现。因此,从m_String
读取的所有内容都需要添加null
检查(如果是类则不需要)。
另外,正如其他人指出的那样,docs在选择何时使用struct
方面还有其他指导:
✓考虑到以下情况,请定义结构而不是类: 类型小,通常寿命短或通常嵌入 其他对象。
X AVOID定义一个结构,除非该类型具有以下所有条件 特点:
在逻辑上代表单个值,类似于基本类型 (int,double等)。
实例大小小于16个字节。
这是一成不变的。
它不必经常装箱。
对于Uri
,尤其是16字节的要求可能会出现问题。