ddlSomeDropDownType.SelectedValue
是 .aspx
页面的下拉列表。
我有以下代码:
int num = int.Parse(((object)this.ddlSomeDropDownType.SelectedValue).ToString());
我认为发生以下情况是否正确:
- 下拉值(字符串)向下转换为对象
- 对象是引用类型,所以
.ToString()
在这个实例中不做任何事情,被编译器忽略 - 然后对象被解析为 int:ref type => value type
或者 C# 编译器会选择它,而不是在不需要时进行转换吗?
最佳答案
drop down value (string) gets down-casted to object
嗯,是的,但所有改变的是编译器如何绑定(bind)对该对象的后续调用。您告诉编译器“将此值视为一个对象
”,它不会以任何方式更改实际对象。
object is a reference type so
.ToString()
doesn't do anything in this instance, gets omitted by compiler
不 - 您调用 ToString
,它是 object
上的一个虚拟方法,因此 object.ToString
或后续覆盖将被调用(在你的例子中,string.ToString()`。
另外,您已经告诉编译器将该值视为对象
。您希望编译器返回并说“好吧,我知道您告诉我将其视为一个对象,但我可以从上面的代码中看出它是一个字符串,所以我将忽略它并将其保留为一个字符串”。编译器不会去做那个努力。 JIT 优化器可能做类似的事情,如果有一个铁定的保证它会工作;否则它会按照您的指示去做。
object than gets cast to int
不 - 它由 int
类解析 - 与转换非常不同。它将读取字符串的字符并尝试返回等效的整数值。原始对象(字符串)保持不变,并创建了一个新值(int)。如果你“改变”了原始值(在这种情况下这是不可能的,因为字符串是不可变的,但为了论证,我们假设你可以)那么解析的整数将不会改变。如果您将对象转换为 int,然后然后更改了字符串,它们都引用相同的值,因此更改会反射(reflect)在两者中。
由于 SelectedValue
是一个字符串,因此无需转换为对象然后然后调用 ToString()
,因此您的代码可以得到简化到
int num = int.Parse(this.ddlDiscountType.SelectedValue);
关于c# - 字符串、对象和整数之间的转换和解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35207496/