字符串、对象和整数之间的转换和解析
casting and parsing between string, object and int
ddlSomeDropDownType.SelectedValue
是 .aspx
页面的下拉列表。
我有以下代码:
int num = int.Parse(((object)this.ddlSomeDropDownType.SelectedValue).ToString());
我认为发生以下情况是否正确:
- 下拉值(字符串)向下转换为对象
- 对象是引用类型,因此
.ToString()
在这种情况下不执行任何操作,被编译器忽略
- 然后对象被解析为 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).ToString 是 object class 方法(可以被派生的 classes 覆盖) .实际上这里发生的是 int.Parse 接受字符串参数。为此,您首先将其转换为对象,然后调用 .ToString 方法。
3:是的,第三点是正确的
ddlSomeDropDownType.SelectedValue
是 .aspx
页面的下拉列表。
我有以下代码:
int num = int.Parse(((object)this.ddlSomeDropDownType.SelectedValue).ToString());
我认为发生以下情况是否正确:
- 下拉值(字符串)向下转换为对象
- 对象是引用类型,因此
.ToString()
在这种情况下不执行任何操作,被编译器忽略 - 然后对象被解析为 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).ToString 是 object class 方法(可以被派生的 classes 覆盖) .实际上这里发生的是 int.Parse 接受字符串参数。为此,您首先将其转换为对象,然后调用 .ToString 方法。
3:是的,第三点是正确的