当前位置: 首页 > 面试题库 >

为什么要避免铸造?

段干飞翮
2023-03-14
问题内容

通常我会尽可能避免转换类型,因为我认为这是不良的编码实践,并且可能会导致性能下降。

但是,如果有人要我解释为什么会这样,我可能会像前灯中的鹿一样看它们。

那么,为什么/何时铸造不好?

它对于Java,C#,C ++是通用的,还是每个不同的运行时环境都按照自己的方式处理?

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


问题答案:

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

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

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


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

从更一般的角度来看,情况非常简单(至少是IMO):强制转换(显然足够)意味着您正在将某种东西从一种类型转换为另一种类型。当/如果您这样做,则会引发“为什么?”的问题。如果您确实希望某种东西是特定类型,为什么不将其定义为开头的那个类型呢?这并不是说
没有
理由进行这样的转换,但是在任何时候,它都会提示您是否可以重新设计代码,以便在整个过程中使用正确的类型。甚至看似无害的转换(例如,在整数和浮点之间)也应比通常更仔细地检查。尽管他们
看起来
相似,整数应真正用于“计数”类型的事物,而浮点数应用于“已度量”类型的事物。无视这种区别是导致一些疯狂言论的原因,例如“美国家庭平均有1.8个孩子”。即使我们都能看到这种情况,但事实是
没有一个 家庭有1.8个孩子。他们可能有1个,或者可能是2个,或者可能更多,但从来没有1.8个。



 类似资料:
  • 在React中,我尝试了两种方法: 然后更改状态this.setState(this.state) 克隆状态,更改状态克隆,然后更改此.setState(stateClone) 它们都起作用,产生相同的结果。为什么建议(在文档中)设置为状态克隆(使用Object.assign),而不是设置为状态本身?状态的对象标识在React中重要吗(没有Redux)?似乎只要调用setState,不管状态对象标

  • 问题内容: 我已经在多个地方多次看到过这种情况,但是从未找到令人满意的解释来说明为什么会这样。 因此,希望这里会介绍一个。为什么我们(至少通常)不使用和? 编辑:我看到人们以为这个问题与Web服务器有关,但事实并非如此。我可以理解为什么传递给未经处理的字符串可能很糟糕。在非Web应用程序中不好吗? 问题答案: 通常有更清晰,更直接的方法来获得相同的效果。如果构建复杂的字符串并将其传递给,则代码将难

  • 问题内容: Process p = Runtime.getRuntime().exec(command); is = p.getInputStream(); byte[] userbytes = new byte[1024]; is.read(userbytes); 我想从java在linux os中执行shell命令。但是Pmd报告说不要使用Java Runtime.exec()。为什么?是什么

  • 问题内容: 假设我们在页面上有一个DIV ,并且想要将该DIV的内容复制(“复制粘贴”)到另一个DIV中。我们可以这样做: 或使用jQuery: 但是,看来此方法不是一个好主意,应避免使用。 (1)为什么要避免这种方法? (2)应该怎么做呢? 更新: 为了解决这个问题,我们假设DIV中没有ID为ID的元素。 (对不起,我忘了在原始问题中介绍此案。) 结论: 我已经在下面发布了我对这个问题的答案(如

  • 我的公司不允许使用Mockito。在单元测试中验证。甚至有一个定制的声纳规则 规则如下 应该通过断言来验证结果,而不是使用“验证到执行”过程验证。因为如果我们验证流程,在流程更改后需要更多的努力来维护测试,但输入和输出保持不变。确保每一行代码都对结果有影响,并断言结果以证明逻辑正确 不合规代码示例 合规解决方案 对于数据库或中间件操作,断言使用嵌入式数据库或中间件成功写入数据。 对于restful

  • 为什么可能是这种测试要避免的事情。 我在对这个答案的评论中读到了这一点:https://stackoverflow.com/a/21172873/516167 标记应在其上进行注射的字段。 允许速记模拟和间谍注入 最小化重复模拟和间谍注入 参考:@InjectMocks JavaDoc。