System.Array 是否对值类型执行装箱?

2024-01-04

我最近做了一些粗略的性能测量List<> vs []对于一系列小型结构。 System.Array 似乎轻而易举地获胜了,所以我就这么做了。

我才刚刚意识到 System.Array 包含对象类型,所以用结构填充它肯定会导致装箱发生吗?

然而,System.Array 的 MSDN 条目 http://msdn.microsoft.com/en-us/library/system.array.aspx states:

在 .NET Framework 2.0 版中,Array 类实现System.Collections.Generic.IList<T>, System.Collections.Generic.ICollection<T>, and System.Collections.Generic.IEnumerable<T>通用接口。这 实现在运行时提供给数组,因此 对于文档构建工具不可见。结果,通用的 接口不会出现在数组的声明语法中 类,并且没有接口成员的参考主题 仅可通过将数组强制转换为通用接口类型来访问 (显式接口实现)。

这是否意味着拳击最终不会发生? (并会解释我的表现结果)


如果使用索引器表示法,则不使用数组不会装箱。 例如

new int[2];
x=[1]=3;

编译为以下 IL(请注意,行号不相关,因为它们来自其他代码片段)

IL_0011: ldc.i4.2
IL_0012: newarr System.Int32
IL_0017: stfld Int32[] x
IL_001c: ldarg.0
IL_001d: ldfld Int32[] x
IL_0022: ldc.i4.1
IL_0023: ldc.i4.3
IL_0024: stelem.i4

对于无法使用索引器的语言(我真的不知道它们是否存在),在编译时为数组创建了另外两种方法。

它创建了这些公共方法:

public int Get(int index)
public void Set(int index,int value)

这些方法也不会装箱,并且通常无法通过 C# 访问。 (不要问我为什么它们是公共方法)。您可以使用 IL 或通过创建它们的委托来执行它们。它们速度较慢,因为您被迫执行 callvirt 来调用这些方法。

stelem.* 和 ldelem.* 系列用于处理强类型数组类型的存储。使用泛型时通常会附加以下前缀constrained or readonly当使用一个T[]. stelem.*type 通常不检查类型。例如。使用stelem.i4比使用更快stelem.any Int32除非你在它前面加前缀readonly因为否则它会强制进行类型检查。

现在,类型检查对值类型数组完全没用,因为它们不是协变的!

因为运行时生成从零开始的一维数组(称为 SZ_array 或向量类型)类型,所以它们本身是已知的。

它们有一系列 il 操作码:newarr,stelem.*,ldelem.*,ldlen etc.

The List<T>类型使用T[]其在 BCL 的 Microsoft 实现中的后备存储。List<T>不装箱。无论使用列表还是数组,您都将数据存储在数组中。

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

System.Array 是否对值类型执行装箱? 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • 如何卸载 Perl 模块?

    我在我的 Linux 机器上安装了一些 Perl 模块 如果我输入perldoc perllocal它显示了我的机器中安装的 Perl 模块的列表 但现在我不需要这些 Perl 模块 所以我想删除它们 有谁知道如何卸载或删除Linux de
  • PHP - 比较两个多维数组

    我有两个包含数据的数组 我需要比较这两个数组并创建一个最终数组 这是我的情况 grab a list of the folders folders glob GLOB ONLYDIR create empty array s which w
  • 重试 Visual Studio C# 测试方法

    我很好奇是否有任何内置机制可以retry在 Visual Studio 2008 C 单元测试框架中进行测试 举个例子 我有一个 C 单元测试 如下所示 TestMethod public void MyMethod DoSomething
  • 从一个 dagger 2 模块如何访问另一个 dagger 2 模块中提供的 SharedPreferences

    从一个 dagger2 模块提供 SharedPreferences 后 在另一个 dagger2 模块中想要使用它 怎么做 下面的代码似乎不起作用 组件 Singleton Component modules arrayOf DataMa
  • Redis 6 可以利用多核 CPU 的优势吗?

    Since Redis 6支持多线程IO https redislabs com blog diving into redis 6 在超过2个核心的机器上部署Redis有意义吗 它是否能够利用额外的核心 或者 2 个核心仍然是理想的选择 一
  • 计算阿克曼函数的较大值

    我有一些代码 int CalculateAckermann int x int y if x return y if y return CalculateAckermann x 1 else return CalculateAckerman
  • 返回 Fortran 中不同长度的字符串数组

    我想创建一个类型来包含 Fortran 中的字符串数组 而无需显式分配长度 以便我可以从函数返回它 以下是我的类型 type returnArr Character dimension 4 array end type returnArr
  • 由于 JSON 中转义的单引号,jQuery.parseJSON 抛出“无效 JSON”错误

    我正在使用以下方式向我的服务器发出请求jQuery post 我的服务器正在返回 JSON 对象 例如 var value 但是 如果任何值包含单引号 正确转义 如 jQuery 无法解析有效的 JSON 字符串 这是我的意思的一个例子 在
  • Numpy 每行动态切片

    如何在不使用 for 循环的情况下动态地对给定开始和结束索引的每一行进行切片 我可以使用下面列出的循环来完成此操作 但是对于 x shape 0 gt 1 mill 的情况来说 它太慢了 x np arange 0 100 x x resh
  • 自动缩放 ImageIcon 以适应标签大小

    在我的 JFrame 上 我使用以下代码在面板上显示图像 ImageIcon img new ImageIcon res png jLabel setIcon img 我想 自动调整 标签中图片的大小 事实上 有时图像大小只有几个像素 有时
  • 清除命名图的最有效方法?

    我正在使用 Ontotext GraphDB 的一个实例 并且经常想要清除具有大量三元组的命名图 目前 我的技术涉及向图形服务器发出 SPARQL 命令 该命令搜索并匹配指定图形中每个三元组的三元组模式 DELETE GRAPH examp
  • 如何编写一个 clang 插件在编译时向原始代码注入一些代码

    我遇到了一个关于如何编写一个能够更改代码的 clang 插件的问题 我想向程序中注入一些代码 就像这样 在此处输入代码 the original code the filename is user code cpp int f1 retur
  • 现有应用程序的转换以兼容iphone5? [复制]

    这个问题在这里已经有答案了 可能的重复 如何开发或迁移适用于 iPhone 5 屏幕分辨率的应用程序 https stackoverflow com questions 12395200 how to develop or migrate
  • 如何在 activerecord 之外创建 activerecord 样式验证?

    我正在为我公司编写的软件开发一个测试框架 我们的产品是基于网络的 在运行 RESTful 请求后 我想处理结果 我希望能够在每个命令类中进行 activerecord 类型验证 以便在运行后 结果会自动针对所有 验证 进行测试 但是 我不知
  • 本地图像未在发布和 TestFlight 中渲染

    使用react native v0 63 4 并且所有本地图像在开发模式下加载良好
  • WPF - 从流加载字体?

    我有一个包含字体文件 ttf 内容的 MemoryStream 我希望能够从该流创建 FontFamily WPF 对象WITHOUT将流的内容写入磁盘 我知道这对于 System Drawing FontFamily 是可能的 但我不知道
  • Javascript背景颜色随着淡入淡出而闪烁

    我有一个 div 需要有持续闪烁的背景颜色 我想要它做的就是淡入透明的 to red并循环返回 我见过几个examples这样做 但它们都会影响整个内容div而不仅仅是background color 其他例子有闪烁background但这
  • UIWebView canGoBack 和 canGoForward 始终返回 NO

    我正在尝试将数据直接加载到UIWebView webView loadData data MIMEType text html textEncodingName utf 8 baseURL nil 数据是一些包含一些外部链接的html字符串
  • 去掉最后一个逗号

    当我的程序打印出整数 5 到 1 时 我需要帮助去掉最后一个逗号 int i for i 10 i gt 1 i if i 2 0 System out print i 2 它打印出来5 4 3 2 1 我想要打印出来5 4 3 2 1 一
  • System.Array 是否对值类型执行装箱?

    我最近做了一些粗略的性能测量List lt gt vs 对于一系列小型结构 System Array 似乎轻而易举地获胜了 所以我就这么做了 我才刚刚意识到 System Array 包含对象类型 所以用结构填充它肯定会导致装箱发生吗 然而