考虑以下功能:
public static bool TryToDoStuff(ReadOnlySpan<byte> input, Span<byte> destination) {
...
}
Run Code Online (Sandbox Code Playgroud)
这个函数返回它是否能在"做的东西" destination
基础上input
的内容.
我想检查内存区域是否"包裹" input
并destination
相交,如果是,则抛出异常,因为这会破坏input
数据.我怎么能这样做(没有反射或不安全的代码)?
我知道我可以编写一些xmldoc并警告用户参数不应该相交,但这是一个穷人的解决方案.
编辑:对于那些要求举例的人,Wazner的例子非常重要.
// On arrays
Span<byte> firstArray = new byte[10];
Span<byte> secondArray = new byte[10];
Intersects<byte>(firstArray.Slice(5, 5), firstArray.Slice(3, 5)); // Should throw
Intersects<byte>(firstArray.Slice(5, 5), secondArray.Slice(3, 5)); // Should not throw
// And on stackallocated memory
Span<byte> firstStack = stackalloc byte[10];
Span<byte> secondStack = stackalloc byte[10];
Intersects<byte>(firstStack.Slice(5, 5), firstStack.Slice(3, 5)); // Should throw
Intersects<byte>(firstStack.Slice(5, 5), secondStack.Slice(3, 5)); // Should not throw
Run Code Online (Sandbox Code Playgroud)
我在 dotnet/corefx 存储库上创建了一个问题,其中一位贡献者发布了此链接:
https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.overlaps?view=netcore-2.1
所以,是的,有一个优雅、简洁、安全且在框架内的解决方案来解决这个问题。