c#泛型中非托管和结构约束之间的区别

Posted

技术标签:

【中文标题】c#泛型中非托管和结构约束之间的区别【英文标题】:Difference between unmanaged and struct constraints in c# generics 【发布时间】:2019-03-06 06:17:53 【问题描述】:

where T : struct - 这里 T 必须是值类型。

where T : Unmanaged - 这里的 T 不能是引用类型。

如果struct和unmanaged都用于值类型,有什么区别?

【问题讨论】:

您是否查看过这方面的文档,您对哪一部分感到困惑? 从 C# 7.3 开始,您可以使用非托管约束来指定类型参数必须是非托管类型。非托管类型是一种非引用类型并且在任何嵌套级别都不包含引用类型字段的类型。非托管约束使您能够编写可重用例程来处理可作为内存块操作的类型 【参考方案1】:

根据https://blog.jetbrains.com/dotnet/2018/07/19/unmanaged-delegate-enum-type-constraints-c-7-3-rider-resharper/

为了满足非托管约束,类型必须是结构体 并且该类型的所有字段必须属于以下之一 类别:

类型有 sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、IntPtr 或 UIntPtr。 是枚举类型。 是指针类型。 成为满足非托管约束的用户定义结构。

所以非托管约束比结构约束更具约束力。

【讨论】:

【参考方案2】:

泛型类型 T 的非托管约束强制该类型为 不递归包含引用类型的“非托管”结构 字段。 C# 语言中存在“非托管类型”的概念 找了很久,在C#语言里都能找到这个词 规范和官方文档中,但现在编译器 实际上可以强制执行。

更多信息,您可以在微软官方博客中找到。 https://blogs.msdn.microsoft.com/seteplia/2018/06/12/dissecting-new-generics-constraints-in-c-7-3/

【讨论】:

【参考方案3】:

为了便于理解:struct 表示不接受引用类型,它只接受“值类型”。Unmanaged 表示只接受纯值类型,不能包含任何引用类型部分。

例如:

struct MyStruct

    public int f1;
    public string f2;

此结构在struct 约束中是合法的,但在unmanaged 约束中是非法的。

【讨论】:

以上是关于c#泛型中非托管和结构约束之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

P/Invoke 编组和解组 C# 和非托管 DLL 之间的二维数组、结构和指针

在非托管 C++ DLL 和托管 C# UI 之间发送信息

C# 托管非托管代码

托管库和非托管库之间有啥区别?

托管和非托管的c++是啥意思,有啥区别?

如何在托管 (C#) 和非托管 (C++) 代码之间来回传递数组内容