为什么带有 T: 类约束的泛型方法会导致装箱? [复制]

2024-01-30

为什么将 T 限制为类的通用方法会在生成 MSIL 代码中包含装箱指令?

我对此感到非常惊讶,因为肯定由于 T 被限制为引用类型,所以生成的代码不需要执行任何装箱。

这是 C# 代码:

protected void SetRefProperty<T>(ref T propertyBackingField, T newValue) where T : class
{
    bool isDifferent = false;

    // for reference types, we use a simple reference equality check to determine
    // whether the values are 'equal'.  We do not use an equality comparer as these are often
    // unreliable indicators of equality, AND because value equivalence does NOT indicate
    // that we should share a reference type since it may be a mutable.

    if (propertyBackingField != newValue)
    {
        isDifferent = true;
    }
}

这是生成的 IL:

.method family hidebysig instance void SetRefProperty<class T>(!!T& propertyBackingField, !!T newValue) cil managed
{
    .maxstack 2
    .locals init (
        [0] bool isDifferent,
        [1] bool CS$4$0000)
    L_0000: nop 
    L_0001: ldc.i4.0 
    L_0002: stloc.0 
    L_0003: ldarg.1 
    L_0004: ldobj !!T
    L_0009: box !!T
    L_000e: ldarg.2 
    L_000f: box !!T
    L_0014: ceq 
    L_0016: stloc.1 
    L_0017: ldloc.1 
    L_0018: brtrue.s L_001e
    L_001a: nop 
    L_001b: ldc.i4.1 
    L_001c: stloc.0 
    L_001d: nop 
    L_001e: ret 
}

注意box !!T指示。

为什么会产生这个?

如何避免这种情况?


您不必担心任何性能下降box指令,因为如果它的参数是引用类型,则box指令什么也不做。虽然这仍然很奇怪box甚至已经创建了指令(也许是代码生成时的懒惰/更简单的设计?)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么带有 T: 类约束的泛型方法会导致装箱? [复制] 的相关文章

随机推荐

  • C 以二进制模式读/写文件

    我创建了一个包含 4000 个块的文件 块大小为 4096 字节 现在我想操作单个块并再次读取它们而不更改文件的大小 实际上我想将另一个文件中的块写入我创建的文件中的特定块 因此 我以二进制模式打开文件 如下所示 FILE storeFil
  • Windows 批处理文件中等效的 Switch 语句

    我想知道是否有一种简单的方法可以根据一个表达式的值在 Windows 批处理文件中分支执行 类似于 C C C Java JavaScript PHP 和其他实际编程语言中的 switch case 块 我唯一的解决方法是一个简单的 if
  • SDK/ADT 更新后 Android 库依赖关系被破坏

    今天 我将 Android SDK 和 Eciple ADT 更新到最新版本 ADT Rev 22 重新启动 Eclipse 后 每当我引用自定义库时 它都会对构建路径感到非常不满意 An example is shown in this
  • Javascript 映射二维数组

    我有这个数组 rows 89 18 9 1903 3 4 3 1 800 它应该看起来像这样 89 1903 3 18 3 1 9 4 800 正在运行的代码如下所示 rows 0 map columnIndex gt rows map r
  • Spring Elastic Search 自定义字段名称

    我是 Elastic Search 的新手 我正在尝试使用 Spring data elasticsearch 来实现它 我的弹性搜索文档中有一些名称为 Transportation Telephone Number 的字段 当我尝试将我的
  • 用于通配符 url 映射的 Kubernetes Ingress 控制器

    我需要我的每个用户都可以通过自定义网址访问服务 例如 abccompany mycloudapp com 每个服务都是 kubernetes 服务 我正在查看入口控制器 但我需要一种使用通配符主机字段并以某种方式将值读入 path 和 se
  • #someDiv 是什么意思? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当用户将鼠
  • Google Datastore 模拟器从本地数据库中删除数据

    我的本地计算机 Mac OSX 10 11 6 上运行着一个本地数据存储模拟器实例 我已经有一堆数据了 但我想从本地数据库中删除所有数据 从头开始 不过 我已经尝试删除存储数据的目录 我认为的目录 启动模拟器时会出现此消息 WARNING
  • VS2015中sprintf()和wsprintf()的格式差异

    我正在将一些代码从多字节移动到 unicode 并发现我的字符串格式出现错误 看起来 Visual Studio 2015 在 sprintf 和 wsprintf 之间处理宽度参数说明符 的方式不同 这是编译器错误或副作用 还是我错过了一
  • Angular 9 PWA 哈希不匹配(cacheBustedFetchFromNetwork)

    我有一个 Angular PWA 它无法离线启动 http 错误 504 当我检查 ngsw state 时 出现此错误 Error Hash mismatch cacheBustedFetchFromNetwork https examp
  • codeigniter 分页 - 每个页面上的结果保持相同

    我正在使用 Codeigniter 分页 但遇到了问题 url 在点击时发生变化 如限制更新 例如displayAllUsers 10 到 displayAllUsers 15 但结果保持不变 这是我的控制器 public function
  • C# XAMARIN.FORMS 中的超链接按钮

    我想创建具有点击可能性的标签 就像在 WIN 手机 xaml 中一样
  • 获取 openX 的域详细信息以及 Portrait_id 和 Landscape_id

    我刚刚下载了 OpenX android sdk 并尝试将其指向本地创建的域 但看起来它对我来说效果不佳 布局中的 OXMAdBanner 看起来像
  • 如何从事件处理程序获取 jquery 选择器

    我在页面上有几个输入元素 其中一个 第一个 是我可以输入任何其他元素的特定 ID 的地方 我希望我的代码以这样的方式设置 当我关注任何其他元素并且其 id 与第一个元素中输入的文本匹配时 它会突出显示 并在其中显示指示我选择了正确元素的文本
  • “更改表重命名”和“重命名表”有什么区别?

    我正在使用MySQL 举个例子 我想将表A重命名为B 那么下面的语句有什么区别 alter table A rename to B 和这个 rename table A to B 谁能详细比较一下它们之间的情况吗 是否会根据不同的发动机而有
  • 封装 Action 和 Func

    我正在尝试为某种 IExecutable 接口进行设计 我不会详细介绍 但重点是我有几个需要从基类执行的操作 它们可能采用不同的参数 没什么大不了的 并且它们可能 可能不返回值 到目前为止 这是我的设计 public abstract cl
  • 在 AngularJS 服务调用后填充 jQuery UI 手风琴

    我目前正在尝试构建一个 AngularJS 应用程序 其中使用 jQuery UI 手风琴控件 问题是 jQuery UI 手风琴已启动before我的 AngularJS 服务已完成从服务器加载数据 换句话说 手风琴在启动时没有任何数据
  • 如何在 WPF KeyBinding 中传递来自 DataGrid 的单元格信息?

    我有一个 DataGrid 来列出 MobileInfo 集合 DataGrid 配置为SelectionUnit FullRow 如果我单击任何行 那么它会选择整行 此外它还指向鼠标被击中的带有边框的单元格 边框选择在键盘导航时移动例如
  • 我如何知道库是服务器端、客户端还是两者?

    dart html 是一个客户端库 而 dart io 是一个服务器端库 因为这是显而易见的 但是一个时髦的库怎么样 http pub dartlang org packages http pub dartlang org packages
  • 为什么带有 T: 类约束的泛型方法会导致装箱? [复制]

    这个问题在这里已经有答案了 为什么将 T 限制为类的通用方法会在生成 MSIL 代码中包含装箱指令 我对此感到非常惊讶 因为肯定由于 T 被限制为引用类型 所以生成的代码不需要执行任何装箱 这是 C 代码 protected void Se