You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#中"is Type"会分配内存,"is Type variable"却不会?

这是预期行为,根源在于两种is写法的底层实现逻辑差异

1. thing is MyStruct产生24字节分配的原因

你的泛型方法Meow<T>约束T实现IInterface,当T为值类型MyStruct时,执行thing is MyStruct的底层逻辑是:

  • CLR需要验证thing的实际类型是否为MyStruct,但由于泛型参数带接口约束,此处会触发装箱操作——把值类型的thing装箱为IInterface引用类型对象。
  • 64位系统下,CLR分配的最小对象大小为24字节(16字节对象头+8字节对齐,即便你的MyStruct是空结构),这就是你看到的24字节内存分配的来源。

2. thing is MyStruct meow无内存分配的原因

这种带变量声明的模式匹配是C# 7.0引入的特性,编译器针对该场景做了定向优化:

  • 编译器可直接识别泛型参数T的实际类型为MyStruct(值类型),无需装箱,直接完成类型检查并将thing的值拷贝到新声明的meow变量中。
  • 整个过程未涉及引用类型对象的分配,因此GC.GetTotalAllocatedBytes测量的内存变化为0。

关于GC.GetTotalAllocatedBytes的使用

你对该API的使用是正确的:传入true会强制触发一次垃圾回收,确保测量的内存变化仅来自测试的is操作,排除了其他后台分配的干扰,结果可信。


内容的提问来源于stack exchange,提问作者Trisibo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:42:09