【发布时间】:2020-04-15 04:18:51
【问题描述】:
这个问题是关于 .NET Core 3.1 和 C# 8.0(或更新的预发布版本)。
我需要编写一个通用方法来比较非托管值类型的两个值(即满足 C# unmanaged 约束的值类型)以实现按位相等。我意识到某些值类型可以具有带间隙的字段布局,或相等语义,其中具有不同位模式的值被预定义的相等运算符视为相等,反之亦然,具有相同位模式的值被认为不相等。例如
using static System.BitConverter;
using static System.Console;
WriteLine(ToDouble(GetBytes(0x8000000000000000ul)) ==
ToDouble(GetBytes(0x0000000000000000ul))); // True
WriteLine(ToDouble(GetBytes(0xFFF8000000000000ul)) ==
ToDouble(GetBytes(0xFFF8000000000000ul))); // False
我不关心这些问题。我对被视为不透明斑点的值的按位相等感兴趣。如果可能,我宁愿避免创建数据副本和固定。这是我目前的做法:
using System;
using static System.Runtime.CompilerServices.Unsafe;
using static System.Runtime.InteropServices.MemoryMarshal;
public static class BitwiseUtils
{
public static bool BitwiseEquals<T>(in T x, in T y) where T : unmanaged
{
return AsBytes(CreateReadOnlySpan(ref AsRef(in x), 1)).SequenceEqual(
AsBytes(CreateReadOnlySpan(ref AsRef(in y), 1)));
}
}
它似乎非常有效,但看起来过于冗长。你能提出一个更简单的版本吗?
【问题讨论】:
-
你有高效的代码来说明它做什么和做什么......你的问题究竟是什么? ;)
-
这是 7 个方法调用(包括一些来自可怕的“不安全”类),用于 2 个值的简单按位相等。我想我可能忽略了一个更简单的方法......是的,除了
SequenceEqual之外的所有方法调用都被 JIT 内联,但仍然...... -
除非指针算术比对不安全类的调用更让你害怕,否则至少我会坚持你所拥有的...... ;)
标签: c# .net-core bitwise-operators value-type c#-8.0