【问题标题】:Why do we have to use "Convert" with integers, but not with strings?为什么我们必须对整数使用“转换”,而不是字符串?
【发布时间】:2021-03-01 11:33:45
【问题描述】:

这不是“我有问题”。这是我得到的一个通用问题。

所以,我正在编程数独,因为我很无聊,我有一个问题。

label1.text = int1.toString();

为什么这行得通而不是这个:

int1 = label1.text.ToInt32();

为什么我们必须使用 Convert 函数?像这样:

int1 = Convert.ToInt32(label1.text);

【问题讨论】:

  • 我们不必使用Convert。没有ToInt32()。如果我们想获取数字或日期值,我们确实需要解析文本,使用适当的 Parse 方法,如 int.Parse()DateTime.Parse
  • 有取舍。在设计框架时,他们决定将“任何东西”转换为字符串将是一个普遍的愿望(想想调试器等必须向您显示某物的当前值,并且在早期没有额外的调试钩子) .而转换为 Int32 远没有那么“通用”——只有少数类型才真正有意义。
  • 此外,还有无数种类型。不可能为所有这些创建一个String.ToXYZ 方法。提供自己的ToString()Parse 实现是类型的工作
  • 如果你真的想要,你可以创建你自己的.ToInt32()extension method(然后你可以调用Convert或Parse)
  • 简短:每个对象肯定可以提供一些自身的字符串表示。然而,并非所有内容都可以以数字方式表达,或者您希望myTree 变成什么数字?当然,您可以为数字添加语义来表达一些Tree,但您为什么要这样做呢?

标签: c# .net


【解决方案1】:

“ToString”的初始目标不是将对象转换为字符串。 目标是成为“抽象函数”。

将代表值映射到抽象值的抽象函数 他们代表

更多关于abstraction function

这意味着它将用于了解对象的当前状态,并且将其作为字符串更容易。

所以 ToString 不是一个“转换为字符串”的函数,它是一个“给我这个对象的抽象”,结果是一个字符串。

例子:

假设我将实施我自己的日期。 抽象将是一个包含年、月和日的日期(从外部世界来看是这样),但在内部我可以以不同的方式进行管理:

  • 我可以有 3 个字段(年/月/日)。
  • 我可以拥有 Unix 纪元(自 1970 年以来的毫秒数)
  • ...

ToString 会将表示(3 个字段或 Unix 纪元,...)转换为外部世界所期望的抽象。

【讨论】:

  • 这是错误的。 ToString 不应该是对精确表示的抽象,即序列化机制。 Quote from docs: "It converts an object to its string representation so that it is suitable for display." 例如,new List<int>{1,2}.ToString() 返回 "System.Collections.Generic.List``1[System.Int32]" 而不是 "1,2"
  • 制作“适合展示”的东西与抽象函数的目的并没有太大的不同,那么为什么会出错呢?我在您链接的文档中没有看到它是一种序列化机制。如果是这种情况,您为 List 展示的示例证明不是一个好的序列化机制。
  • 我同意默认的 ToString 机制(显示类型)不是一个抽象函数(显然不可能编写一个适合所有新创建类型的抽象函数),但它已在少数情况下被覆盖情况(Datetime、Timespan、int、...),在这些情况下,ToString 是一个抽象函数。这不是因为它没有在我的陈述错误的所有地方实施。根据您链接的文档,我仍然相信 ToString 的目的是成为一种抽象函数。
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2011-08-29
  • 2019-11-26
  • 1970-01-01
  • 2020-09-02
相关资源
最近更新 更多