C# 关于dotnet/runtime的实现细节

C# 关于dotnet/runtime的实现细节,c#,.net,C#,.net,最近,我很兴奋地阅读了corefx的部分内容(最近转移到了dotnet/runtime repo)。我偶然发现了这个方法: 公共静态无效副本(数组sourceArray、长sourceIndex、数组destinationArray、长destinationIndex、长长度) { int isourceIndex=(int)源索引; int idestinationIndex=(int)destinationIndex; int-ilelength=(int)长度; if(sourceInde

最近,我很兴奋地阅读了corefx的部分内容(最近转移到了dotnet/runtime repo)。我偶然发现了这个方法:

公共静态无效副本(数组sourceArray、长sourceIndex、数组destinationArray、长destinationIndex、长长度)
{
int isourceIndex=(int)源索引;
int idestinationIndex=(int)destinationIndex;
int-ilelength=(int)长度;
if(sourceIndex!=isourceIndex)
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.sourceIndex,ExceptionResource.ArgumentOutOfRange\u hugarr不受支持);
if(destinationIndex!=idestinationIndex)
ThrowHelper.throwargumentoutofrange\u hugar不支持ThrowHelper.throwargumentofrange异常(exception argument.destinationIndex,exception resource.ArgumentOutOfRange\u hugar);
如果(长度!=ilength)
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.length,ExceptionResource.ArgumentOutOfRange\u hugarr不受支持);
副本(sourceArray、isourceIndex、destinationArray、idestinationIndex、ilength);
}

我注意到的是,该方法将
long
参数转换为
int
(这意味着它将丢弃MSB),并将它们压缩为实际参数,如果它们不相等,则抛出exception。我看到的是,当且仅当这些
long
参数中的任何一个大于int.MaxValue或小于int.MinValue时,才会抛出异常。问题是,为什么这些参数从一开始就是长的?为什么不让它们
int

这样做的原因是API将其定义为支持大范围的值,但此实现不支持复制“大数组”,因此会引发异常。API中没有定义不应支持“大型阵列”,只是实现而已。其他实现可能支持long可以定义的任何数组大小,或者可以更改此实现以支持它。如果类型为int,则需要对API进行突破性的更改


NET API通常使用long来处理长度和大小,因此无需更改,而是需要巨大的值

只有微软才能明确回答“为什么”这个问题。也就是说

这种方法以及其他类似的方法都是为了方便而提供的。在某些情况下,可能有一个
long
值表示要复制的数组中的区域。例如,在使用非托管内存时,稍后会逐段复制到托管阵列

如果没有这样的重载,调用方将不得不执行相同的工作以获得相同的安全程度,并且很可能会执行错误的操作(例如,在不检查溢出的情况下仅转换值)


通过提供
long
参数重载,该框架既方便又能更好地抵抗客户端代码错误。这样,客户机在适当的时候仍然可以使用
long
值,并将它们直接传递给框架API,而不必做额外的工作来正确地转换它们。

这是否回答了您的问题@培根,这个问题的答案我不清楚。我想我在这里得到的答案解释得更好。