为什么要避免铸造? [关闭]

2024-06-25

我通常会尽可能避免强制转换类型,因为我的印象是这是糟糕的编码实践,并且可能会导致性能损失。

但如果有人让我解释一下为什么会这样,我可能会像头灯下的鹿一样看着他们。

那么为什么/什么时候选角不好呢?

它对于 java、c#、c++ 是通用的还是每个不同的运行时环境都以自己的方式处理它?

欢迎任何语言的细节,例如为什么它在 C++ 中不好?


您已经用三种语言标记了这个问题,而这三种语言之间的答案确实有很大不同。对 C++ 的讨论或多或少也意味着对 C 强制转换的讨论,这或多或少给出了第四个答案。

由于这是您没有明确提到的,我将从 C 开始。C 强制转换有很多问题。一是他们可以做许多不同事情中的任何事情。在某些情况下,强制转换只是告诉编译器(本质上):“闭嘴,我知道我在做什么”——也就是说,它确保即使您进行可能导致问题的转换,编译器也会不会警告您这些潜在的问题。仅举个例子,char a=(char)123456;。定义的此实现的确切结果(取决于char),除非在相当奇怪的情况下,否则可能没有用。 C 类型转换还取决于它们是仅在编译时发生的事情(即,您只是告诉编译器如何解释/处理某些数据)还是在运行时发生的事情(例如,从 double 到 double 的实际转换)长的)。

C++ 试图通过添加许多“新”强制转换运算符来至少在某种程度上解决这个问题,每个运算符都仅限于 C 强制转换功能的一个子集。这使得(例如)意外地进行您实际上不打算进行的转换变得更加困难 - 如果您only想要放弃对象的常量,你可以使用const_cast,并确保only它可以影响的是一个对象是否是const, volatile, 或不。相反,一个static_cast不允许影响一个对象是否是const or volatile。简而言之,您拥有大多数相同类型的功能,但它们是经过分类的,因此一次强制转换通常只能执行一种转换,而单个 C 样式强制转换可以在一个操作中执行两种或三种转换。主要的例外是你can use a dynamic_cast代替一个static_cast至少在某些情况下,尽管被写成dynamic_cast,它最终会变成static_cast。例如,您可以使用dynamic_cast向上或向下遍历类层次结构 - 但层次结构“向上”转换始终是安全的,因此可以静态完成,而层次结构“向下”转换不一定安全,因此它是动态完成的。

Java 和 C# 彼此更加相似。特别是,对于它们来说,强制转换(实际上?)始终是运行时操作。就 C++ 强制转换运算符而言,它通常最接近dynamic_cast就真正完成的事情而言——即,当您尝试将对象转换为某种目标类型时,编译器会插入一个运行时检查以查看是否允许该转换,如果不允许,则抛出异常。确切的细节(例如,用于“错误转换”异常的名称)有所不同,但基本原理仍然基本相似(不过,如果没记错的话,Java 确实会将转换应用于少数非对象类型,例如int更接近于 C 类型转换——但这些类型很少被使用,以至于 1) 我不太记得这一点,2) 即使它是真的,也没关系)。

从更一般的角度来看,情况非常简单(至少在我看来):强制转换(显然足够)意味着您正在将某些内容从一种类型转换为另一种类型。当/如果你这样做时,就会提出一个问题“为什么?”如果您确实希望某物成为特定类型,为什么不一开始就将其定义为该类型呢?这并不是说有never进行此类转换的原因,但无论何时发生,都应该提示您是否可以重新设计代码以便始终使用正确的类型的问题。即使看似无害的转换(例如整数和浮点数之间的转换)也应该比常见的转换更仔细地进行检查。尽管他们的seeming相似的是,整数实际上应该用于“计数”类型的事物,而浮点数应该用于“测量”类型的事物。忽视这种区别就会导致一些疯狂的说法,比如“美国家庭平均有 1.8 个孩子”。尽管我们都可以看到这是如何发生的,但事实是no家庭有1.8个孩子。他们可能有 1 个,也可能有 2 个,或者可能有更多——但绝不会是 1.8 个。

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

为什么要避免铸造? [关闭] 的相关文章

随机推荐

  • Terraform 本地执行配置程序中的转义字符

    我想使用链接 Terraform 和 Ansiblelocal exec供给者 然而 由于这需要输入to安西布尔fromTerraform 我被以下复杂的命令困扰 provisioner local exec command sleep 6
  • 文本字段中的 SwiftUI 颜色输入

    我遇到了 SwiftUI 的问题 当用户输入文本字段时 我需要将文本字段中的所有字母设置为红色 将所有数字设置为黑色 假设我有这个代码 TextField A99 text viewModel code padding trailing m
  • 为 d3.js 中的多个元素生成 ClipPaths

    我正在尝试创建部分填充的圆圈 就像最终的 纽约时报 政治大会可视化中的圆圈一样 http www nytimes com interactive 2012 09 06 us politics convention word counts h
  • 从 IsCmdBld.exe 设置 InstallShield 2009 InstallScript 项目的版本

    我对 InstallShield 非常陌生 并且继承了一个 InstallScript 项目 我已经找到了解决办法并解决了大部分问题 但是 我希望在每次构建产品时在我们的构建服务器上自动构建该项目 我这个工作正常 但由于某种原因 我无法增加
  • 如何在Spring Boot中设置@Cacheable的过期时间?

    我在 Spring Boot 应用程序中有以下缓存实现 它工作正常 没有任何问题 但是 我想定义这种方法的过期时间 是否可以设置过期时间 Cacheable 我看着到期时间 Cacheable弹簧靴 https stackoverflow
  • 让 bootstrap col 发挥作用

    我有一组链接 我想均匀地间隔开它们 这些链接也应该是移动响应的 我似乎无法让他们加入公司 code associated with it ul menu padding 0 ul menu li display inline ul menu
  • 我们如何为 Prometheus 指标添加额外的标签?

    假设我们在一个月内收集相同的指标 现在我们想要修改指标以拥有额外的标签 也在旧数据中 我们该如何做到这一点 现有指标 mongodb exporter last scrape duration seconds instance 127 0
  • ANR 输入调度超时

    ANR 输入调度超时 等待发送非按键事件 因为触摸的窗口尚未完成处理超过 500 0 毫秒之前传递给它的某些输入事件 等待队列长度 60 等待队列头年龄 8503 2 毫秒 你好 我从几个用户那里收到了这个奇怪的 ANR 报告 不幸的是 我
  • 如何在java中使用Liquigraph为Neo4j存储生成索引和约束脚本?

    我正在尝试生成Index and Constraint对于我的弹簧实体 我没有使用 spring data 的任何功能来执行此操作 例如indexes auto assert 如何生成具有以下条件的脚本 我需要在中生成脚本offline模式
  • 如何对期望通过引用更新对象的方法进行单元测试?

    我在对更改传递给它的引用类型的某些属性的方法进行单元测试时遇到问题 举个例子 假设我有一个名为 Policy 的类 Policy policy new Policy policy Status Active 然后 我将此策略传递给策略管理器
  • MVVM基础视图模型类

    我正在努力创建一个基本视图模型类 ViewModelBase 是一个抽象类 我想定义我希望所有其他派生视图模型实现的属性 其中一个属性是 ObservableCollection public abstract ObservableColl
  • [TFS 2015]:将用户从一个 AD 域迁移到另一个 AD 域

    我们计划将用户从我们公司的域 domainA 迁移到我们母公司的域 domainB 用户的登录 ID 将从domainA firstname lastname 更改为domainB employee 目前 TFS 服务器将驻留在domain
  • 如何解析以毫秒为单位的日期?

    我有一个以下格式的日期 2014 03 10 11 20 34 3454 我怎样才能解析这个日期 The 计时文档 https lifthrasiir github io rust chrono chrono 提到解析年 月 分和秒 没有毫
  • 从 iPhone 应用程序中启动指南针应用程序

    我正在尝试类似的方法从我的应用程序中启动指南针 NSString stringURL compass NSURL url NSURL URLWithString stringURL UIApplication sharedApplicati
  • 匹配除字符串列表之外的所有内容的正则表达式

    我需要匹配计划标识符的正则表达式 如果它找到任何不允许的字符串 该标识符将终止 我有这样的代码 function make tokens re var tokens specials names sort a b gt b length a
  • 更新 Android SDK Tools 后 Eclipse 中出现 xml 错误

    这是我在布局 XML 文件中遇到的错误 error NotFoundException null Exception details are logged in Window gt Show View gt Error Log The fo
  • 无法访问的代码:错误还是警告? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这是一个语言设计问题 你认为无法访问的代码 一般编程语言中 应该提出warning 即 报告问题并无论如何编译 或error 拒绝编译 我个人强
  • 如何用现代logback取回MDC“继承权”?

    在返回到旧项目并更新其依赖项后 我必须意识到 logback 不再将 MDC 传播给子版本1 1 5 https github com qos ch logback commit aa7d584ecdb1638bfc4c7223f4a5ff
  • 不规则形状的Windows窗体(C#)

    做到这一点最简单的方法是什么 托管代码可以吗 this BackgroundImage Image this FormBorderStyle FormBorderStyle None this Width this BackgroundIm
  • 为什么要避免铸造? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我通常会尽可能避免强制转换类型 因为我的印象是这是糟糕的编码实践 并且可能会导致性能损失 但如果有人让我解释一下为什么会这样 我可能会