字符串、对象和整数之间的转换和解析

casting and parsing between string, object and int

ddlSomeDropDownType.SelectedValue.aspx 页面的下拉列表。 我有以下代码:

int num = int.Parse(((object)this.ddlSomeDropDownType.SelectedValue).ToString());

我认为发生以下情况是否正确:

  1. 下拉值(字符串)向下转换为对象
  2. 对象是引用类型,因此 .ToString() 在这种情况下不执行任何操作,被编译器忽略
  3. 然后对象被解析为 int:引用类型 => 值类型

或者 C# 编译器会接受它,而不是在不需要时进行转换吗?

drop down value (string) gets down-casted to object

嗯,是的,但所有改变的是编译器如何绑定对该对象的后续调用。您是在告诉编译器 "treat this value as an object" 它不会以任何方式更改实际对象。

object is a reference type so .ToString() doesn't do anything in this instance, gets omitted by compiler

否 - 您调用了 ToString,它是 object 上的一个虚拟方法,因此将调用 object.ToString 或后续覆盖(在您的情况下,string.ToString ()`.

此外,您已告诉编译器将该值视为 object。您希望编译器返回并说 "well, I know you told me to treat it as an object, but I can tell from the code above that it's a string, so I'm going to ignore that and just keep it as a string"。编译器不会去做那个努力。 JIT 优化器 可能 做类似的事情,如果有一个铁定的保证它会工作;否则它会按照你的指示去做。

object than gets cast to int

否 - int class 解析 - 与转换非常不同。它将读取字符串的字符并尝试 return 一个等效的整数值。原始对象(字符串)保持不变,并创建了一个新值(int)。如果你 "change" 原始值(在这种情况下这是不可能的,因为字符串是不可变的,但为了论证,我们假设你可以)那么解析的整数将不会改变。如果您 casted 对象为 int 并且 then 更改了字符串,它们都引用相同的值,因此和更改将反映在两者中。


因为 SelectedValue 是一个字符串,所以不需要转换为对象然后 然后 调用 ToString(),所以你的代码可以简化为

int num = int.Parse(this.ddlDiscountType.SelectedValue);

不,不是真的。

首先,您需要了解运行时类型信息和编译时类型信息之间的区别。

ddlDiscountType.SelectedValue 的编译时类型是 string。当您将其转换为 object 时,它不会更改运行时类型,只会更改编译时类型 - 实际上,您减少了引用的 public 接口。

ToString是一个虚方法,所以只要你不使用new,会发生什么取决于运行时类型,与编译时类型无关,因为只要该方法是在编译时类型中定义的。由于 ToString 是在 Object 上定义的,所以没有问题。

编译器无法删除对 ToString 的调用,因为您已明确指出 "No, this reference is not really a string. It's just an object.",因此您必须进行虚拟方法调用。该调用将使用引用的运行时类型,因此您正在执行 String.ToString(),它只是 returns this。但是你竭尽全力干扰编译器,编译器不会再猜你。

最后,int.Parse将解析字符串并输出一个整数。当然,这涉及逐个字符地遍历字符串。引用和值类型在这里并不重要——它不是强制转换,它是一个像任何其他方法调用一样的方法调用。该方法将字符串转换为数字,仅此而已。转换会简单地抛出一个 InvalidCastException,因为字符串是 而不是 整数(尽管如果你创建自己的类型,你可以提供自己的转换方法,它可以做任何事情你想让他们做)。编译器无法告诉您不能将字符串转换为整数,因为您只是说引用实际上不是字符串,而是 object - 和 object 可以转换为int,如果它指的是盒装int.[=27=的运行时类型]

没有理由把事情搞得这么复杂。只要做:

var number = int.Parse(ddlDiscountType.SelectedValue);

努力添加正确的错误处理,而不是做愚蠢的仪式:)

1:这不正确。 "Drop Down value (string) is Up-casted into object "..NET Framework 中的所有 classes 都派生自 object.(向 Base class 向上转换 .)

2: a) 是的对象是引用类型。

b).ToStringobject class 方法(可以被派生的 classes 覆盖) .实际上这里发生的是 int.Parse 接受字符串参数。为此,您首先将其转换为对象,然后调用 .ToString 方法。

3:是的,第三点是正确的