将结构传递到接口字段中是否会分配?

2023-12-25

我有一个像这样的结构

struct MyStructure
    :IFoo
{
}

和这样的方法:

public BarThisFoo(IFoo a)
{

}

我的问题是将结构传递到该方法中是否会“装箱”结构,从而导致垃圾分配?

附录: 在有人说之前,垃圾收集在这个应用程序中并不是免费的,它实际上对垃圾收集非常敏感,因此免费分配的代码很重要。


为了避免装箱,您可以使用带有约束的泛型:

struct MyStructure
    :IFoo
{
}

public void BarThisFoo<T>(T a) where T : IFoo
{

}

See J. Richter 通过 C# 进行 CLR https://rads.stackoverflow.com/amzn/click/com/0735621632,第二版,第 14 章:接口,有关泛型和接口约束的部分。

EDIT:

示例代码

using System;
using System.Collections;

interface IFoo {
    void Foo();
}
struct MyStructure : IFoo {
    public void Foo() {
    }
}
public static class Program {
    static void BarThisFoo<T>(T t) where T : IFoo {
        t.Foo();
    }
    static void Main(string[] args) {
        MyStructure s = new MyStructure();
        BarThisFoo(s);
    }
}

Main 方法的 IL 代码不包含任何框指令:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       15 (0xf)
  .maxstack  1
  .locals init ([0] valuetype MyStructure s)
  IL_0000:  ldloca.s   s
  IL_0002:  initobj    MyStructure
  IL_0008:  ldloc.0
  IL_0009:  call       void Program::BarThisFoo<valuetype MyStructure>(!!0)
  IL_000e:  ret
} // end of method Program::Main
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将结构传递到接口字段中是否会分配? 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我

随机推荐

  • 使用 Selenium Scraper (Python) 时消除 % 符号

    下面是一个 Selenium 网络抓取工具 它循环访问该网站页面的不同选项卡 选择 导出数据 按钮 下载数据 添加yearid列 然后将数据加载到MySQL表中 import sys import pandas as pd import o
  • AngularJS 错误 - [$compile:multidir] 多个指令错误

    我使用这些包 来自 Angular ui 包的 Angularjs 模态 http angular ui github io bootstrap modal http angular ui github io bootstrap modal
  • 数据库设计主键、ID 与字符串

    我目前正在计划开发一个音乐流应用程序 我想知道什么作为服务器上表中的主键会更好 ID int 或唯一字符串 方法一 歌曲表 SongID int 标题 string 艺术家 string 长度 int 专辑 string 流派表Genre
  • 仅允许输入数值 Datagridview 特定列

    有什么方法可以自定义 datagridview 列以仅接受数值 此外 如果用户按数字以外的任何其他字符 则不得在当前单元格上键入任何内容 有什么方法可以解决此问题 private void gvAppSummary EditingContr
  • 在 TFS2015 update2 vNext 构建配置中发送请求时发生错误

    配置 TFS vNext 构建代理时出现错误 连接到服务器时出错 发送请求时发生错误 的请求 我在事件日志或其他任何地方找不到任何其他错误消息 请帮忙 更新1 SSL https tfs 不起作用 但是简单的 http 起作用了 更新 2
  • 一个巨大的 CSS - 还是许多小的 CSS?

    希望是简单的问题 我们有一个超过 3000 行的样式表 因此在渲染页面时存在明显的延迟 问题是 是使用一个覆盖所有内容的大型样式表更好 还是使用许多覆盖页面不同部分的小样式表更好 例如 一个用于布局 一个用于下拉菜单 一个用于颜色等 这只是
  • OCaml 语言的 IDE

    除了 Camelia 之外 还有其他值得信赖的 OCaml IDE 吗 如果存在的话 我更喜欢基于 Eclipse 的 IDE 编辑 十年后 2022 VS Code OCaml 平台 https marketplace visualstu
  • 通过 CPU/GPU 的占位符获取不同的值

    当我运行下面的代码时 我认为我得到了错误的结果 OVER GPU import tensorflow as tf sess tf Session a tf placeholder tf float32 b tf placeholder tf
  • 如何在 CakePHP 中强制刷新图像和 css 文件?

    我有以下问题 我正在 CakePHP 中编码 而且我是新手 我经常需要更改网站上的一些图像或 css 文件 在网站上我总是看到旧的内容 除非我手动按键盘上的 F5 我必须在每个使用该网站的工作场所执行此操作 这很令人恼火 尤其是因为我不知道
  • 更改子进程中的环境变量 - bash

    嗨我有以下示例 a sh 脚本设置了我可以在 b sh 子 脚本中看到的环境变量 但是如果我更改它 我仍然在 a sh 中保留旧值 a sh bin bash export A 1 b sh echo parent A b sh bin b
  • 存储WPF图像资源

    对于需要 10 20 个小图标和图像用于说明目的的 WPF 应用程序 将它们作为嵌入式资源存储在程序集中是正确的方法吗 如果是这样 如何在 XAML 中指定图像控件应从嵌入资源加载图像 如果您将在多个地方使用该图像 那么值得将图像数据仅加载
  • 比较 Highcharts 组合图表中工具提示内的两个数据点

    我有一个共享单个 Y 轴的组合条线图 条形图和折线图的数据点始终共享相同的 Y 值 我希望能够计算工具提示中两个 X 值之间的差异 这是我正在使用的图表 组合图 http jsfiddle net 7RQU4 让它工作 诀窍在于工具提示的共
  • 如何编写 ZF2 路由器脚本以允许默认操作上的参数

    我试图解决 ZF2 中路由语句的一些特性 相册模块示例建议如下 router gt array routes gt array album gt array type gt segment options gt array route gt
  • 如何消除 Windows.Forms 自定义控件滚动时的闪烁?

    我想用 C 创建一个自定义控件 但每次我必须完全重绘控件时 即使我使用双缓冲 首先绘制到图像 然后位图传输 它也会闪烁 当我必须完全重绘时如何消除闪烁 您可以尝试在 InitializeComponent 调用之后将以下内容放入构造函数中
  • 如何使用 Knex.js 从列中检索唯一值?

    I use Knex js http knexjs org 与 Postgres 数据库通信 我的表中有一些行 其中有一列名为 state 代表美国的一个州 如何从此列中检索所有唯一值 您可能正在寻找不同的节点 https knexjs o
  • 如何对推送通知进行分组

    我正在向我的 Android 手机发送推送通知 我希望对这些通知进行分组 这样我的通知列表就不会被淹没 根据文档 来自同一 源 的消息被分组 但在我的手机上 消息总是显示为未分组 我从 Google Apps 脚本调用推送 API 并尝试在
  • 从多个远程Windows服务器获取磁盘空间信息

    我正在尝试制作一种工具 可以登录多个远程 Windows 服务器并获取其驱动器详细信息并将其显示在一个窗口下 我希望在远程服务器中执行的可能命令是wmic logicaldisk get size freespace caption 我打算
  • matplotlib 文本未剪切

    绘制文本时matplotlib with text 然后交互平移图像 生成的绘制文本不会剪切到数据窗口 这与使用绘制数据或绘制文本的方式相反annotate 有效 并且没有直观意义text 使用数据窗口坐标 import matplotli
  • 当 CWD 更改时,如何在 Python 模块中使用相对路径?

    我有一个 Python 模块 它使用模块目录的子目录中的一些资源 在搜索堆栈溢出并找到相关答案后 我设法使用类似的方法将模块定向到资源 import os os path join os path dirname file fonts my
  • 将结构传递到接口字段中是否会分配?

    我有一个像这样的结构 struct MyStructure IFoo 和这样的方法 public BarThisFoo IFoo a 我的问题是将结构传递到该方法中是否会 装箱 结构 从而导致垃圾分配 附录 在有人说之前 垃圾收集在这个应用