为什么Uri是类而不是结构?

时间:2019-02-07 11:17:18

标签: c# .net

System.Uri似乎很适合成为struct的候选人,但Microsoft的好伙伴决定将其设为class。显然,它是一个值对象->具有两个不同的“ https://stackoverflow.com实例是没有意义的,因此它具有结构相等的规则。我在公共API上也看不到任何设置器,所以它是不可变的。

是否有一些实现细节规定它必须为class

1 个答案:

答案 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字节的要求可能会出现问题。