【问题标题】:When to use a Cast or Convert何时使用 Cast 或 Convert
【发布时间】:2020-11-14 19:33:12
【问题描述】:

我很想知道使用int 与使用Convert.ToInt32() 相比有什么区别。使用一个是否有某种性能提升?

还应该分别用于哪些情况?目前我更倾向于使用Convert,但我没有理由去任何一种方式。在我看来,我认为他们都实现了相同的目标。

【问题讨论】:

  • disagreemy question 是这个问题的精确副本。这个问题询问何时使用强制转换或转换,下面接受的答案指出:“无论您使用哪种方式,这都是一个选择问题。”我的问题专门询问铸造和使用Convert.To() 之间的区别。因此,我的问题是对您问题的补充。

标签: c# casting


【解决方案1】:

当它真的是int 类型时进行转换,当它不是int 但你希望它变成一个类型时转换。

例如 int i = (int)o; 当你知道 o 是一个 int 时

int i = Convert.ToInt32("123") 因为“123”不是 int,它是 int 的字符串表示形式。

【讨论】:

  • 这对使用枚举有什么影响?
【解决方案2】:

在另一个论坛上查看Diff Between Cast and Convert

回答

下面的Convert.ToInt32(String, IFormatProvider) 调用Int32.Parse(阅读备注)。
所以唯一的区别是,如果传递一个空字符串,它会返回0,而Int32.Parse 会抛出一个ArgumentNullException
无论您使用哪种方式,这都是一个选择问题。

就我个人而言,我两者都不使用,并且倾向于使用TryParse 函数(例如System.Int32.TryParse())。


更新

顶部的链接已损坏,请参阅 StackOverflow 上的 this answer

【讨论】:

  • 重要:我最近注意到的另一个区别是“Cast”将 1.63 转换为 1,而“Convert”将 1.63 转换为 2。所以基本上转换回合和转换但强制转换会截断小数点后的值。
  • 有时 TryParse 不可用。
  • Compact Framework 缺少 TryParse:stackoverflow.com/questions/22670260/…
  • 仅供参考 @AbijeetPatro 的评论,引用自 Joseph Albahari 和 Ben Albahari 的 C# 5.0 in a Nutshell。版权所有 2012 Joseph Albahari 和 Ben Albahari,978-1-449-32010-2。 When you cast from a floating-point number to an integral, any fractional portion is truncated; no rounding is performed. The static class System.Convert provides methods that round while converting between various numeric types
  • OP在哪里说过他要转换字符串?如果演员表是一个选项,它不能是一个字符串。
【解决方案3】:

还有一个区别。 “转换”总是溢出检查,而“转换”可能,取决于您的设置和使用的“检查”或“未检查”关键字。

更明确地说。 考虑代码:

int source = 260;
byte destination = (byte)source;

那么目的地将是 4 而没有警告。

但是:

int source = 260;
byte destination = Convert.ToByte(source);

会给你一个例外。

【讨论】:

    【解决方案4】:

    并非所有类型都支持像

    这样的转换
    int i = 0;
    decimal d = (decimal)i;
    

    因为需要实现explicit operator。但是 .NET 也提供了IConvertible interface,因此任何实现该接口的类型都可以转换为大多数框架内置类型。最后,Convert 类有助于操作类型实现 IConvertible 接口。

    【讨论】:

      【解决方案5】:

      转换只是告诉编译器这个对象实际上是一个不同类型的实现,并且现在把它当作新的实现来对待。转换者说这不会继承您要转换的内容,但是有一种固定的方法可以做到。例如,假设我们将“16”转换为 int。 "16" 是一个字符串,不会以任何方式继承自 int。但是,很明显“16”可以变成int 16。

      【讨论】:

        【解决方案6】:

        加上我的 2c —— 似乎概念上的区别可能有用。并不是说我是专家.. :

        选角正在改变代表类型。因此,“32”和 32L 和 32.0f 在彼此之间转换似乎是合理的。 c# 不会自动支持“32”,但大多数动态语言会。所以我将使用(长)“32”或(字符串)32L。什么时候可以。我还有另一条规则——投射应该是可往返的。

        转换不必是往返的,可以简单地创建一个全新的对象。

        灰色区域例如是字符串“32xx”。可以做一个例子,当你施放它时,它变成了 32L(这个数字被解析到不能被解析)。 Perl 使用了这个。但这违反了我的往返要求。 32.5f 到 32L 也是如此。几乎所有语言(包括非常静态类型的语言)都允许这样做,而且它也违反了往返规则。它是灰色的,如果您允许强制转换“32”,那么在编译时您不知道它是否可能是“32xxx”。

        另一个可以做出的区别是只对“IsA”使用强制转换,而不是对“makeLookLikeA”。因此,如果您知道字符串来自数据库,但实际上是非官方模式中的 int,请随意使用强制转换(尽管在这种情况下,c# 无论如何都希望您使用 Convert)。浮动也是如此。但不适用于仅使用强制转换截断浮点数的情况。这种区别也解释了 DownCasting 和 UpCasting —— 对象始终为“IsA”,但类型可能已泛化为列表。

        【讨论】:

          【解决方案7】:

          Convert.ToInt32 有很多重载,例如可以采用字符串。尝试将字符串转换为 int 时会引发编译错误。关键是它们用于不同的用途。当您不确定要转换的对象是什么类型时,转换特别有用。

          【讨论】:

            【解决方案8】:

            您应该使用 Convert.ToInt32 而不是强制转换还有一个原因。

            例如:

            float a = 1.3f;
            float b = 0.02f;
            int c = (int)(a / b);
            int d = Convert.ToInt32(a / b);`
            

            结果是 c = 64 和 d = 65

            【讨论】:

            • 这不是因为演员,这是转换规则。当您除以 2 个浮点数时,您会收到双精度值 64.999999068677411,当转换为 int 时,它会截断为仅整数部分。但这将返回 65: (int)(float)(a / b)),因为在 float 中它正好是 65,而不是 64.99(9)。十进制也一样。相反,Convert 对结果进行四舍五入,因此它在这里返回 65,但 64.49 将是 64。有趣的是 Intellisense 说强制转换为浮点数是多余的,而没有它返回 64
            【解决方案9】:

            字符串编号 = "123abc";

            整数;

            Int32.TryParse(number, out num); // 这次调用没有抛出异常

            Convert.ToInt32(数字); // 这个调用抛出异常

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-09-12
              • 2016-01-19
              • 2014-08-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-10-14
              相关资源
              最近更新 更多