Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Uri是类而不是结构?_C#_.net - Fatal编程技术网

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

C# 为什么Uri是类而不是结构?,c#,.net,C#,.net,Uri似乎是一个完美的结构候选,但是微软的好人决定把它变成一个类。它显然是一个值对象->拥有两个不同的实例是没有意义的,因此它具有struct-y相等规则。我在公共API上也看不到任何setter,因此它是不可变的 是否有一些实现细节规定它必须是一个类?结构总是有一个默认构造函数,其中所有字段都将初始化为其默认值。例如,这可能会导致一些内部字段出现问题 一个例子是,现有的构造函数确保m_字符串不能为null-。如果将其设置为结构,则在C中很难实现。因此,无论从哪里读取m_字符串,都需要添加空检查

Uri似乎是一个完美的结构候选,但是微软的好人决定把它变成一个类。它显然是一个值对象->拥有两个不同的实例是没有意义的,因此它具有struct-y相等规则。我在公共API上也看不到任何setter,因此它是不可变的

是否有一些实现细节规定它必须是一个类?

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

一个例子是,现有的构造函数确保m_字符串不能为null-。如果将其设置为结构,则在C中很难实现。因此,无论从哪里读取m_字符串,都需要添加空检查,如果它是类,则不需要该检查

此外,正如其他人所指出的,在选择何时使用struct时,用户还有其他指导:

✓ 如果是实例,请考虑定义结构而不是类。 类型很小,通常寿命很短,或者通常嵌入到 其他物体

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

它在逻辑上表示单个值,类似于基元类型 整数、双精度等

它的实例大小小于16字节

它是不变的

它不必经常装箱

特别是对于Uri,16字节的要求可能会有问题。

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

一个例子是,现有的构造函数确保m_字符串不能为null-。如果将其设置为结构,则在C中很难实现。因此,无论从哪里读取m_字符串,都需要添加空检查,如果它是类,则不需要该检查

此外,正如其他人所指出的,在选择何时使用struct时,用户还有其他指导:

✓ 如果是实例,请考虑定义结构而不是类。 类型很小,通常寿命很短,或者通常嵌入到 其他物体

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

它在逻辑上表示单个值,类似于基元类型 整数、双精度等

它的实例大小小于16字节

它是不变的

它不必经常装箱


特别是16字节的要求,可能会对Uri造成问题。

这实际上是代码审查的问题,不是stackoverflow,但要回答它:Uri不仅仅是一个字符串,字符串经过分析,Uri类有很多变量,您不希望每次都复制它。System.Uri包含7个字段,每一个都是一个引用的大小。就性能而言,这对于结构来说太多了。@FelixK。另外,MS关于何时使用结构的指导原则是避免使用大小大于16字节的结构。正如其他人所说,Uri比这个大一点:因此它有struct-y相等规则一个类可以实现struct-y相等规则如果它选择的话。这实际上是一个代码审查的问题,不是stackoverflow,但要回答它:Uri不仅仅是一个字符串,字符串被分析,Uri类有很多变量,您不希望每次都复制它。System.Uri包含7个字段,每个字段的大小与引用的大小相同。就性能而言,这对于结构来说太多了。@FelixK。另外,MS关于何时使用结构的指导原则是避免使用大小大于16字节的结构。正如其他人所说,Uri比这个要大一点:因此它有struct-y相等规则。如果类愿意,它可以实现struct-y相等规则。