首页 > 解决方案 > 为什么 Uri 是类而不是结构?

问题描述

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

是否有一些实现细节表明它必须是一个class

标签: c#.net

解决方案


Astruct总是有一个默认构造函数(所有字段都将被初始化为其默认值)。例如,这可能会导致一些内部字段出现问题。

一个例子是现有的构造函数确保不能m_String为空 - https://referencesource.microsoft.com/#system/net/system/UriExt.cs,39。如果将其设为结构,则无法在 C# 中轻松实现。因此,在您阅读的任何地方都m_String需要添加一个null检查(如果它是一个类,则不需要)。

此外,正如其他人指出的那样,文档对选择何时使用还有其他指导struct

✓ 如果类型的实例很小且通常短暂存在或通常嵌入在其他对象中,请考虑定义结构而不是类。

X 避免定义结构,除非该类型具有以下所有特征:

它在逻辑上表示单个值,类似于原始类型(int、double 等)。

它的实例大小小于 16 个字节。

它是不可变的。

它不必经常装箱。

特别是 16 字节的要求可能对Uri.


推荐阅读