unsafe
修饰符时存在一定的行为。我希望能够得到一些澄清。我正在开发一个相当大的包装器,为了保持理智,我使用
partial
修饰符将其拆分成多个文件。该包装器广泛使用unsafe
指针,因此我选择在类级别上声明它以覆盖其中的所有内容。public static unsafe partial class Ruby
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static VALUE CLASS_OF(VALUE obj) => ((RBasic*) obj)->klass;
}
在另一个文件中:
public static unsafe partial class Ruby
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void* DATA_PTR(VALUE obj) => ((RData*) obj)->data;
}
"
unsafe
修饰符对于每个部分声明是必需的,以便允许并编译不安全代码,这是可以理解的,我希望部分类的声明需要完全匹配。
但按照这个逻辑,我也被允许拥有另一个文件,该文件不是unsafe
:
[SuppressUnmanagedCodeSecurity]
public static partial class Ruby
{
[DllImport(RUBY_LIBRARY, CallingConvention = CallingConvention.Cdecl)]
public static extern VALUE rb_ivar_get(VALUE obj, ID name);
}
在这里,我没有使用
unsafe
修饰符,这是完全可以的(显然此文件中没有不安全的代码)。我希望能够澄清为什么允许这样做。难道每个部分类的类声明不应该完全匹配吗?更改/排除任何其他类修饰符是不允许的,例如
private
,public
,abstract
等,那么为什么在使用unsafe
时就没问题了呢?我认为这种行为不一致。我的猜测是编译器以某种方式在不同的上下文中运作,但这只是我自己的推测,希望比我更有知识的人能给我一些启示。