所有 C# 转换都会导致装箱/拆箱吗

2024-02-01

我很想知道 C# 中的所有强制转换是否都会导致装箱,如果不是,那么所有强制转换都是成​​本高昂的操作吗?

示例取自装箱和拆箱(C# 编程指南) http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

    int i = 123;
    // The following line boxes i.
    object o = i;  

这一行显然会导致装箱(将 int 类型包装为对象)。 这是一个被认为成本高昂的操作,因为它会产生需要收集的垃圾。

来自 2 种不同类型的引用类型的强制转换怎么样?这样做的代价是多少?可以正确测量吗? (与前面的例子相比)

例如:

public class A
{
}

public class B : A
{
}

var obj = new B();
var obj2 = (A)obj; // is this an "expensive" operation? this is not boxing

我很好奇 C# 中的所有转换是否都会导致装箱。

不会。只有装箱转换才会产生装箱,因此称为“装箱转换”。装箱转换都是从值类型到引用类型的内置转换——要么是值类型继承的类,要么是它实现的接口。 (或者通过协变或逆变引用转换到与其实现的接口兼容的接口。)

所有转换都是成​​本高昂的操作吗?

不会。标识转换的成本为零,因为编译器可以完全消除它们。

隐式和显式引用转换的成本是多少?

隐式引用转换都是零成本。编译器可以完全消除它们。也就是说,从 Giraffe 转换为其基本类型 Animal,或者从 Giraffe 转换为其实现的接口类型 IAmATallMammal,都是免费的。

显式引用转换涉及运行时检查以验证该引用确实引用了所需类型的对象。

运行时检查是否“昂贵”取决于您的预算。

这个成本可以正确衡量吗?

当然。确定哪些资源与您相关(例如时间),然后用秒表仔细测量您的时间消耗。

一个你没有问但可能应该问的问题:

最昂贵的转换是什么?

用户定义的转换只不过是方法调用的语法糖;与任何方法一样,该方法可能需要任意长的时间。

动态转换在运行时再次启动编译器;编译器可能需要任意长的时间来执行类型分析,具体取决于您选择向其抛出的分析问题的难度。

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

所有 C# 转换都会导致装箱/拆箱吗 的相关文章

  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • Couchbase v6.0:更新文档内容而不重置文档过期(TTL)值

    我正在使用 Net Couchbase SDK CouchbaseNetClient Package 创建一个新文档 并在执行此操作时设置该文档的到期值 到期 TTL 值设置正确并且工作正常 问题陈述 创建文档后 我需要更新我使用 N1QL
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • 从匿名类型获取值

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

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • 变量中的 Terraform 变量

    首先 抱歉 我对使用 terraform 非常陌生 才用了 3 个小时 我希望尝试在另一个变量的声明中使用一个变量的值 下面是我的代码 我做错了什么 变量 tf variable EnvironmentName type string va
  • VS 2010 和 VS 2012 中的不同 LINQ 答案

    下面给出的答案在VS 2010中为1 在VS 2012中为2 我个人认为应该是2 我不确定这里发生了什么 using System Linq using System Text using System Threading Tasks us
  • 如何获取有子链接的文本?

    我目前正在尝试找出如何获取具有子项的链接的文本 我的 html 看起来很像这样 a href The text I want to get span something I don t want to get span a 我只想获取 我想
  • 授予 IIS 以管理员身份运行的权限(以便从写入文件夹的 Web .exe 运行)

    我有一个 APImvc4通过调用 exe 文件 过程 class 这个 exe使用log4net 然后运行另一个 exe 将文件导出到目录和子目录 在该过程结束时 exe 将发布到 http API Process p new Proces
  • 忽略(不提交)Git 跟踪的本地删除的文件

    我需要从 Git 存储库跟踪的文件系统中删除文件 并且希望将该文件保留在 Git 存储库中不变 不提交到存储库 对于本地修改的文件来说很容易 我使用更新索引的假定未更改选项并且它工作得很好 我需要对已删除的文件进行相同的行为 我尝试过这个但
  • Python SSL 套接字服务器

    我想设置一个基本的 ssl 验证套接字服务器来进行一些网络通信 我收到以下错误 它似乎来自 SSLIOStream 在阅读之前没有握手 File simple ssl server py line 70 in connection read
  • 制作一个覆盖整个页面的div

    我想制作一个覆盖整个页面的 div 我设置了 height 100 的 css 样式 但这仅覆盖了可视区域 我希望当我向下滚动时它也覆盖该区域 Use position fixed这样你的 div 将持续保持在整个可视区域 给你的div一个
  • Express 会话未持续

    我正在尝试在节点中建立一个基本的会话系统 这是我到目前为止所得到的 app js app use express cookieParser stackoverflow app use express session 我在 ajax js 中
  • JQuery:在整个对象之前插入

    下面的代码用于选择特定对象并将其插入到 sharepoint 2010 中员工目录项列表中的所有对象之前 如果职位名称在列表中managerTitles 如果此人尚未准备好 则将其设为列表中的第一个 if inArray jobTitle3
  • “UnexpectedTagNameException”和 Element 应该是“select”,但通过 Selenium java 使用“Select”函数却出现“div”错误

    在这种形式下 下拉选择不起作用 在上图中 我想选择 借贷能力 我为它编写代码 public static void main String args throws InterruptedException WebDriver driver
  • 使用 GPUImagePoissonBlendFilter 进行混合

    我尝试使用 GPUImage 框架的 GPUImagePoissonBlendFilter 在我的脸部混合应用程序中混合两个脸部 这是我的代码 void applyPoissonBlendToImage UIImage rearFace w
  • 在 iOS 中的 Safari 中打开本地 PDF

    假设 myURL 指向通过执行以下操作获得的 PDF myURL NSBundle mainBundle URLForResource my withExtension PDF 我可以调用 UIApplication sharedAppli
  • Python 析构函数未调用

    任何人都知道如何让我的析构函数在对象销毁时调用 def del self os unlink self pidfile 场景 有一个运行进程的守护进程 守护进程收到一个 SIGTERM 并立即向 Process 发送一个 SIGTERM 进
  • ubuntu下安装pycairo

    由于某种原因 我无法让 python 找到开罗 当我执行 waf 配置时 我得到了 Setting top to home user pycairo py2cairo 1 10 0 Setting out to home user pyca
  • 如何验证文本区域中的模式匹配?

    当我在 javascript 中使用 textarea checkValidity 或 textarea validity valid 且值无效时 这两个总是返回 true 我做错了什么
  • 如何在 Android 应用程序中将图像上传到 FTP 服务器?

    是否可以将图像从我的 Android 应用程序上传到 FTP 服务器 该图像已经使用相机捕获 在桌面应用程序中 我们使用 FTP 客户端将任何文件 图像上传到实时服务器 我们如何在 Android 应用程序中做类似的事情 使用这个对我来说效
  • 在蓝牙打印机上打印

    我需要在蓝牙打印机上打印 我已经有一个用于 Windows 移动平台的程序 它通过蓝牙将命令和数据发送到斑马 RW 420 打印机 http www zebra com id zebra na en index products print
  • 如何使用 Spring 的 @Cacheable 和 Aerospike 作为缓存?

    我只想用Aerospike作为后备缓存Spring CacheManager 当我不打算使用时我应该使用 spring data aerospikeAerospike作为数据存储但仅作为缓存 有没有类似的实现HazelcastCacheMa
  • 使用 .NET Core(API 和 HTTP)创建 Azure AD 应用程序和服务主体

    继续我以编程方式创建 Azure 应用程序的探索 这从https stackoverflow com a 44753728 1332416 https stackoverflow com a 44753728 1332416 我的核心获得了
  • 所有 C# 转换都会导致装箱/拆箱吗

    我很想知道 C 中的所有强制转换是否都会导致装箱 如果不是 那么所有强制转换都是成 本高昂的操作吗 示例取自装箱和拆箱 C 编程指南 http msdn microsoft com en us library yz2be5wk aspx i