C#中(int)和Convert.ToInt32的区别

4
当我通过以下方式将一个对象转换为整数时:
(int)object

当对象值为0时,会出现特定转换无效的错误提示。

我将一个对象转换为整数的方式如下:

convert.toint32(object)

然后他工作并给我0,这意味着投掷是有效的。

我想知道两者之间的区别。

1. (int)object
2.convert.toint32(object)
5个回答

13

(int)仅对实际为整数的对象有效。例如,(int) "12"将引发无效的强制类型转换异常。

Convert.ToInt32尽最大努力将其输入转换为整数。因此,Convert.ToInt32("12")将返回12。准确来说,如果对象实现了IConvertible接口(System.String就实现了该接口),则Convert.ToInt32将调用IConvertible.ToInt32方法。


1
(int) 可以用于不仅仅是 int 类型的对象。例如,如果你有一个 double 类型的变量,你可以使用 (int) 将其转换为 int 类型,如下所示: double value1 = 5.5; int value2 = (int)value1; 此时 value2 的值将等于 5。你指出的区别在于,(int) 不会尝试将字符串值解析为 int 类型。 - ManiacZX

4

这两种方法完全不同。第一种是casting,第二种是conversion

Conversion是在需要将非整数值转换为int时使用的。

Casting用于将已经封装为Object类型的int实例unboxint类型。


3
在一般情况下,(Type)val 可以表示以下内容:
  • 语言定义的内置转换(例如,float 和 int 之间的转换)
    • 可能需要实际操作(例如 float <===> int)
    • 或者仅为编译器的好处(例如 int <===> an-int-enum)
  • 引用转换(永远不会改变引用或对象;它只是将本地句柄类型化)
    • 可能需要类型检查(例如 object ===> IDataReader)
    • 但可能已经知道是真的(例如 IDataReader ===> object)
  • 装箱/拆箱操作(始终初始化值类型,或在堆上创建一个新对象 [除了对 Nullable<T> 进行 null-boxing])
  • 类型定义的转换运算符(隐式或显式),它运行类型中定义的任何代码
给定一个 object 值,(int)object 将假定它是一个 拆箱 操作,因此只有当对象一个 boxed int(或 boxed int-enum)时才能工作。如果对象值实际上是字符串或 boxed-float 等,则会失败。 Convert.ToInt32 的工作方式不同;它运行一些测试,尝试将诸如从 float 进行类型转换(上面已经涵盖)和解析字符串(映射到 int.Parse)等内容汇集在一起。

2

有很多方法可以将数据转换为int,很大程度上取决于你的数据来源。

最重要的是错误检查,这些方法本身都不是完美的,因此需要决定如何处理它们。

使用(int)进行强制类型转换,使用Convert.ToInt32()进行转换,使用int.Parse()进行解析,都可能会生成异常,例如InvalidCastException、FormatException和OverflowException,应该使用try/catch来处理失败的结果。

使用int.TryParse()进行解析将返回一个true/false结果,表示解析是否成功,并且如果成功,将在函数调用中设置输出参数的值。

如果你真的想将任何对象转换为int,最好使用Convert.ToInt32,例如:

public void TestFunction(object input)
  try {
    int value = Convert.ToInt32(input);
    SomeOtherFunction(value);
  }
  catch (Exception ex) {
    Console.WriteLine("Could not determine integer value");
  }
}

另一种可能是依赖于该对象在.ToString()中产生可用值,例如:

public void TestFunction(object input)
  try {
    int value = int.Parse(input.ToString());
    SomeOtherFunction(value);
  }
  catch (Exception ex) {
    Console.WriteLine("Could not determine integer value");
  }
}

2

(int) something可以在以下两种情况下使用:

  1. something是int类型,并且已经装箱到对象中,我们使用调用来将其取消装箱。如果您将int放入ArrayList或HttpSession中等,就会发生这种情况。

  2. something不是int,但它的类型可以明确转换为int,例如内置类型的short、long、float,或实现了明确转换运算符的类型。

Convert.ToInt32调用something类型的IConvertible.ToInt32方法,基本等同于int.Parse(something)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接