使用 Array.CreateInstance 和 new 运算符实例化数组的区别

2023-11-26

我可以看到以下两种在 C# 中实例化 int 数组的方法:

  1. 通过 API系统.数组抽象类:

    var arrayInstance = Array.CreateInstance(typeof(int), 4);
    
  2. 通过各种数组初始化语法:

    var arrayInstanceWithSyntax = new int[4];
    

以上两种方式完全一样吗?编译器是否在编译时将第二个语法转换为第一个语法,然后将其作为 MSIL 嵌入到 DLL 中?另外,是否有可能在运行时发生 CLR 级别的一些 JIT 魔法,或者两种代码语法之间没有发生转换?


他们肯定创造了同样的价值 - 不像你打电话Array.CreateInstance例如,创建一个下限非零的数组。

然而,它们在 IL 方面并不相同 - 第一个只是方法调用,第二个使用newarrIL指令。

这里不需要任何类型的“JIT 魔法”——只有两条路径可以创建相同类型的值。

The 编译时你的第一个变量的类型只是Array不过 - 你必须把它投射到int[]使两段代码确实具有相同的结果。

我总是尽可能使用“C# 本机”数组创建语法 - 仅使用Array.CreateInstance当你有一个元素时Type由于某种原因(而不是在编译时知道,即使通过泛型类型参数)......或者如果您trying创建一个可能具有非零下限的数组。

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

使用 Array.CreateInstance 和 new 运算符实例化数组的区别 的相关文章

随机推荐

  • 将 FormsAuthentication cookie 传递给 WCF 服务

    我有一个与远程 WCF Web 服务通信的网站 两者都使用相同的自定义 FormsAuthentication Provider 我想通过模拟当前登录网站的用户的 WCF 服务进行身份验证 我已经使用 UserName 客户端凭据手动执行此
  • 将 data 属性添加到 leaflet.js 标记元素

    目标 将数据属性添加到 leaflet js 标记元素标记中 我有一个带有地图和 聚光灯 区域的项目 使用 leaflet js 填充地图上的位置 当我单击地图上的图钉时 我希望其相应的图像和信息出现在聚光灯区域中 我在没有地图的情况下做了
  • 通过XAML将Window.Content设置为页面?

  • 写入 Perl Moose 类中的只读属性

    使用 Perl 和Moose 可以通过两种方式访问 对象数据 self gt attribute or self gt attribute 这是一个简单的例子 展示了两者 Person pm package Person use stric
  • Rails / ActiveRecord - AdapterNotSpecified,即使它是

    我正在做Ruby on Rails 教程 前三章使用 SQLite 但后来建议使用 PostgreSQL 进行开发 以便更轻松地部署 Heroku 编辑我的后database yml and Gemfile使用 pg 而不是 sqlite3
  • 如何在 protobuf 3 中定义可选字段

    我需要在 protobuf proto3 语法 中指定带有可选字段的消息 就proto 2语法而言 我想要表达的信息是这样的 message Foo required int32 bar 1 optional int32 baz 2 根据我
  • Android:如何在继承Activity的类中使用onDraw方法?

    作为初学者 我一直在使用简单的布局 xml 和一个名为 Counter 的类构建一个简单的计数器应用程序 该类派生 扩展 自 Activity 类 现在 我想加载一个位图 png 文件 以放置在计数器旁边 我一直在阅读 onDraw 但它需
  • 指针是否也有任何地址或内存分配?

    如果指针存储变量的地址 那么我们从哪里获得指针呢 我问的是 如果我们直接使用指针 那么一定有一个位置可以从哪里获取这个指针 是的 声明的指针在内存中有自己的位置 在上面的示例中 您有一个变量 b 它存储值 17 int b 17 the v
  • C#:编组包含数组的结构

    我正在做一些 C 互操作工作 我有以下结构 pragma pack push 1 typedef struct unsigned int64 Handle LinkType t Type LinkState t State unsigned
  • 使用 LessCSS 用户定义函数?

    我最近刚刚接触 LessCSS 我遇到了我认为的主要限制 我想知道是否有办法做到这一点 我想说我在某处读到 Sass 允许用户定义函数 但 LessCSS 会做同样的事情吗 我想要做什么 fs 16 either return the va
  • 如何在 Elm 中提交表单?

    这是一个非常基本的问题 但我没有找到任何例子 我有这样的看法 view address model div div text lt ID toString model id form input value model title text
  • SES AWS 错误代码:SignatureDoesNotMatch,状态代码:403

    我在尝试通过 Amazon SES 发送邮件时收到 AWS 错误代码 SignatureDoesNotMatch 状态代码 403 我已确认我使用的是通过以下方式创建的正确凭据https console aws amazon com iam
  • 检查 GET 中是否传递了任何变量

    我已经做了一些搜索 但没有得出任何结果 我确信这是显而易见的 基本上 我试图弄清楚是否有任何内容通过 GET 从表单传递 我知道如何检查单个元素 但我只想快速检查是否有任何内容通过 Cheers 使用时要小心count GET 如果您提交包
  • 如何在ActionBar的导航选项卡中设置自定义View并使选项卡适应其高度?

    我正在使用ActionBar我想设置一个自定义View在导航选项卡中 选项卡的高度似乎是固定的 我的自定义View较大 所以不适合 我尝试自定义样式 如下所示 但它并没有使选项卡更高 如何让选项卡的高度适应我的自定义View size 我知
  • 压缩 xml 文件的 Subversion diff

    我正在使用 MySQL Workbench 来维护应用程序的数据库架构 这 mwbWorkbench 使用的文件是一个压缩的 XML 文档 保存在 Subversion 存储库中 该文件被 Subversion 视为二进制数据 因此我无法使
  • 有没有办法跟踪批处理文件的执行情况?

    我继承了一些大型批处理文件 我想将它们重写为更 开发人员友好 的语言 我想了解以下几点 它调用了什么其他脚本 它启动了哪些其他进程 它写入哪些文件 它使用哪些环境变量 设置哪些环境变量 对于最后一点 我知道在开始之前我可以这样做 set g
  • Opengls eglCreateWindowSurface GL 错误 EGL_BAD_ALLOC

    我正进入 状态eglCreateWindowSurface GL Error EGL BAD ALLOC在三星 Galaxy S6 中安装后首次打开应用程序时 相同的代码在其他设备中运行良好 我尝试清理内存并销毁纹理并在销毁时取消初始化所有
  • 无法在 64 位 Linux 上构建 32 位 Wine

    我正在尝试这样做 使用 automake 配置脚本在 64 位 Linux 上构建 32 位 对我不起作用 编译酒 我在 config log 中找到了这个 configure failed program was confdefs h d
  • 使用 Python 处理 MySQL 未读结果

    我使用 mysql connector 进行 SQL 操作 我有一个简短的脚本 它在光标上执行以下操作 字符串 cursor execute use format db show tables command ALTER TABLE Obj
  • 使用 Array.CreateInstance 和 new 运算符实例化数组的区别

    我可以看到以下两种在 C 中实例化 int 数组的方法 通过 API系统 数组抽象类 var arrayInstance Array CreateInstance typeof int 4 通过各种数组初始化语法 var arrayInst