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

标签 c# .net casting

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

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

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

  1. 下拉值(字符串)向下转换为对象
  2. 对象是引用类型,所以 .ToString() 在这个实例中不做任何事情,被编译器忽略
  3. 然后对象被解析为 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/

相关文章:

c# - 在设计时更改 AppResources

c# - 参数 'angle' 隐藏字段 'float Utils.Transform.float'

.net - 创建一个安装程序,在安装中创建+设置 SQL Server 数据库 - WPF/

c# - 交互服务与交互请求对象

C++ 使用带字符串的标准算法,带 isdigit 的 count_if,函数转换

c# - 无法解密我用 BouncyCaSTLe C# 加密的 OpenPGP 数据

c# - 比较 2 个日期并忽略差异的毫秒数

.net - Microsoft Visual C++ 2003、2005——它们是.Net还是非托管的?

java - Android NDK 是否为通过套接字发送大 int[] 提供加速?

c# - 为什么动态转换会抛出异常?