Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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/8/logging/2.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# Span范围运算符没有意义_C#_.net_.net 5_C# 8.0 - Fatal编程技术网

C# Span范围运算符没有意义

C# Span范围运算符没有意义,c#,.net,.net-5,c#-8.0,C#,.net,.net 5,C# 8.0,我一生都无法理解量程运算符背后的逻辑 我有一个包含IP协议头的以下字节数组: --------------------------------------------------------------------------------- | | | | | | | | | | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 9 | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1

我一生都无法理解量程运算符背后的逻辑

我有一个包含IP协议头的以下字节数组:

---------------------------------------------------------------------------------
|   |   |   |   |   |   |   |   |   |   | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 9 |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---------------------------------------------------------------------------------
|                   other data                  |    src ip     |    dest ip    |
---------------------------------------------------------------------------------
使用range运算符,我需要使用以下值来提取正确的4字节数组:

Span<byte> ipHeader = ethernetFrame.IPHeader;
byte[] sourceIpAddress = ipHeader[12..16].ToArray();
byte[] destinationIpAddress = ipHeader[16..20].ToArray();
相反,如果我使用切片方法,我会得到:

Span<byte> ipHeader = ethernetFrame.IPHeader;
byte[] sourceIpAddress = ipHeader.Slice(12, 4).ToArray();
byte[] destinationIpAddress = ipHeader.Slice(16, 4).ToArray();
range运算符背后的逻辑是什么,它要求我给出一个超出实际结束索引值1的结束值

从性能的角度来看,我也很好奇,因为这个特定的代码块每分钟运行数百万次,使用Slice会更有效吗

我一生都无法理解量程运算符背后的逻辑

值得注意的是,这并不是C语言中的范围所特有的,C语言中的范围总是有一个唯一的上限。有关更多信息,请参阅

range运算符背后的逻辑是什么,它要求我给出一个超出实际结束索引值1的结束值

这只是一个唯一的上限。上限通常是排他性的,这有多重好处。例如,请注意图片中有两个|分隔符?这是指数12和16——这是之前范围的上限,之后范围的下限。相同的数字在这两个地方都很有用,所以不需要开始加减一

请注意,排他上界在for循环中也很常见。如果您想手动复制该src IP地址,我怀疑您会执行以下操作:

对于int指数=12;指数<16;索引++ { //在索引处复制项目 }

我认为比使用包含的上限更为习惯:

对于int指数=12;指数 我一生都无法理解量程运算符背后的逻辑

值得注意的是,这并不是C语言中的范围所特有的,C语言中的范围总是有一个唯一的上限。有关更多信息,请参阅

range运算符背后的逻辑是什么,它要求我给出一个超出实际结束索引值1的结束值

这只是一个唯一的上限。上限通常是排他性的,这有多重好处。例如,请注意图片中有两个|分隔符?这是指数12和16——这是之前范围的上限,之后范围的下限。相同的数字在这两个地方都很有用,所以不需要开始加减一

请注意,排他上界在for循环中也很常见。如果您想手动复制该src IP地址,我怀疑您会执行以下操作:

对于int指数=12;指数<16;索引++ { //在索引处复制项目 }

我认为比使用包含的上限更为习惯:


对于int指数=12;索引可以找到一个有趣的链接,链接到包含与排除的设计决策

报告的结论是:

它允许a.长度作为端点,而无需加/减1。 它使一个范围的结束成为下一个范围的开始,没有重叠 它避免了形式为x..x-1的难看的空范围
可以找到一个有趣的链接,链接到设计决策“包含”与“独占”

报告的结论是:

它允许a.长度作为端点,而无需加/减1。 它使一个范围的结束成为下一个范围的开始,没有重叠 它避免了形式为x..x-1的难看的空范围
我得花点时间才能弄明白,既然你已经把它画出来了,我明白了。只是当你从字节数组的角度来看它时,它并不完全是直观的。在中间阶段,我反编译了为范围操作和切片生成的IL,编译器为范围操作和切片生成了大约6个以上的操作。至于避免字节数组复制,不幸的是,System.Net.IPAddress的构造函数不接受Span作为参数:-/@对我来说,这似乎很直观,但我想我已经习惯于从独家范围的角度来思考了。就性能而言,我真的不会担心那些额外的6个指令。我相信他们基本上是在执行减法运算——我怀疑在非常非常少的情况下,这种差异会被证明是显著的。我通常不会尝试在如此微观的层面上进行优化,只是我正在编写的代码将全天候运行,并将处理TB的数据,因此,我试图通过代码优化来压缩性能的最后一点,同时试图保持简化和类结构之间的平衡,从而使最终的类能够轻松集成到其他项目中。@jscarle:所以,一如既往,关键在于度量。尝试使用范围和使用切片。考虑到您正在创建一个数组并复制数据,如果一个减法变得相关,我会感到惊讶。和
关于网络的任何事情都会让它相形见绌…@jscarle:您可能需要研究调用IPAddresslong构造函数而不是传入字节数组的选项。不过,我还是希望用IPAddress做任何事情都要比构造函数花费更长的时间。现在你已经把它画出来了,我明白了,我需要一点时间来理解它。只是当你从字节数组的角度来看它时,它并不完全是直观的。在中间阶段,我反编译了为范围操作和切片生成的IL,编译器为范围操作和切片生成了大约6个以上的操作。至于避免字节数组复制,不幸的是,System.Net.IPAddress的构造函数不接受Span作为参数:-/@对我来说,这似乎很直观,但我想我已经习惯于从独家范围的角度来思考了。就性能而言,我真的不会担心那些额外的6个指令。我相信他们基本上是在执行减法运算——我怀疑在非常非常少的情况下,这种差异会被证明是显著的。我通常不会尝试在如此微观的层面上进行优化,只是我正在编写的代码将全天候运行,并将处理TB的数据,因此,我试图通过代码优化来压缩性能的最后一点,同时试图保持简化和类结构之间的平衡,从而使最终的类能够轻松集成到其他项目中。@jscarle:所以,一如既往,关键在于度量。尝试使用范围和使用切片。考虑到您正在创建一个数组并复制数据,如果一个减法变得相关,我会感到惊讶。任何关于网络的东西都会让它相形见绌……@jscarle:你可能想研究一下调用IPAddresslong构造函数而不是传入字节数组的选项。尽管如此,我还是希望用IPAddress做任何事情都比构造函数花费更长的时间。
for (int index = start; index < start + length; index++)
{
    // Copy item at index
}