Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 为什么System.Net.Http.HttpMethod是类而不是结构?_C#_Asp.net Core_.net Core_.net Standard - Fatal编程技术网

C# 为什么System.Net.Http.HttpMethod是类而不是结构?

C# 为什么System.Net.Http.HttpMethod是类而不是结构?,c#,asp.net-core,.net-core,.net-standard,C#,Asp.net Core,.net Core,.net Standard,先前有一个问题与.Net标准的System.Net中的一个实现点有关,关于HttpMethod为什么不是枚举 关于扩展性,它有一个很好的答案 然而,正如我在标题中所说的,为什么它不是一个结构 这是一个在web应用程序中被大量抛出的信息,我“认为”DELETE是最长的动词,低于推荐的16字节 这与字符串在.Net中作为中途之家有关吗?我知道收益可能是微乎其微的,但我只是想更好地理解。与类相比,struct不会有太多优势 结构非常适合于memcpy/memcmp类型的实现,在HttpMethod的

先前有一个问题与.Net标准的
System.Net
中的一个实现点有关,关于
HttpMethod
为什么不是枚举

关于扩展性,它有一个很好的答案

然而,正如我在标题中所说的,为什么它不是一个结构

这是一个在web应用程序中被大量抛出的信息,我“认为”
DELETE
是最长的动词,低于推荐的16字节


这与字符串在.Net中作为中途之家有关吗?我知道收益可能是微乎其微的,但我只是想更好地理解。

与类相比,struct不会有太多优势

结构非常适合于memcpy/memcmp类型的实现,在
HttpMethod
的情况下,它是不必要的

如果您查看.net核心实现,您将看到它使用引用相等性检查来比较实例,这比字符串比较稍微快一点。有了结构,就不可能。。。因为大多数结构实例实际上是不同的实例,它们必须比较字符串值

考虑到HTTP方法字符串值不是很长,这里的struct实际上没有其他好处,因为它只携带一个字符串引用,并且大多数HttpMethod实例将是HttpMethod类的静态字段的实例


它也可以是一个普通字符串,但在编译过程中,它不会有助于方法解析等。

16字节不是(唯一)指示何时使用一个而不是另一个。事实上,您可以使用内存分配较高的结构或内存分配较低的类。这只是一个指导方针,你可以打破它。它可以说是,但事实并非如此。它实现了
IEquatable
,在JIT的早期版本中,由于装箱,这本身就是结构上的一个性能陷阱(较新版本在尽可能避免这种情况方面做得更好)。这是否是一个值得关注的问题,或者作者是否只是没有认真思考,这是一个悬而未决的问题。我怀疑
HttpMethod
是否被“抛来抛去”到足以让它变得真正重要:它是复制一个引用,而不是。。。复制引用(内部的
字符串
),因为它是
静态
分配的集合,所以这无关紧要。@Jeroenmoster我想我也不认为
null
方法在域(HTTP)方面有什么用处,不管计算机科学的原因是什么。如果C#只有固定长度的字符串,我们就不必每次都去堆了,因为大小是可变的。堆在本讨论中基本上是不相关的:假设您没有自定义方法,而只使用
HttpMethod
上的静态字段(我想这是最常见的),那么您将得到预分配的实例,每个都指一个插入的字符串。从这个意义上说,C#确实有“固定长度的字符串”——文本是字符串intern池的一部分,这里不需要考虑分配。类或结构,
HttpMethod
没有围绕方法中的实际字符进行复制。在
不安全的
上下文中,结构中可以有一个
char[16]
字段,但这很少是合适的。在这种情况下,要优化的唯一堆分配是服务器端通过解析请求形成的
HttpMethod
(以及伴随的字符串)。如果有必要进行优化(这是不太可能的,因为每个请求只发生一次),只需完全不使用
HttpMethod
,直接比较字符(甚至从
Span
)即可。不过,这正深入到微优化领域,而且可能会有更大的胜利。谢谢。我认为这是一个很好的理由。也许这些考虑因素比空引用类型问题更重要。