为什么 object.ToString() 存在?

2024-01-07

拥有一个不是更加优雅和整洁吗?IStringable界面?

谁需要这个Type.FullName对象返回给我们?

EDIT:每个人都一直问为什么我认为它更优雅..

嗯,就像这样,对象将具有 CompareTo 方法,而不是 IComparable,该方法默认抛出异常或返回 0。

有些对象不能也不应该被描述为字符串。对象可以同样返回string.Empty. Type.FullName只是一个随意的选择..

而对于像Console.Write(object)这样的方法,我认为应该是:Write(IStringable)。

但是,如果您将 WriteLine 用于除字符串之外的任何内容(或者其 ToString 很明显的内容,例如数字),那么在我看来,它仅用于调试模式。

顺便问一下 - 我该如何向大家发表评论?我可以发布答案吗?


恕我直言,有 3 个虚拟方法不应该添加到 System.Object 中......

  • ToString()
  • 获取哈希码()
  • Equals()

所有这些都可以按照您建议的接口来实现。如果他们这样做了,我想我们的情况会好得多。那么为什么这些会成为问题呢?让我们只关注 ToString():

  1. 如果 ToString() 预计由使用 ToString() 的人实现并显示结果,则您有一个编译器无法强制执行的隐式契约。您假设 ToString() 已重载,但没有办法强制如此。
  2. 使用 IStringable,您只需将其添加到通用类型约束中或从中派生接口,以要求在实现对象时使用它。
  3. 如果您发现重载 ToString() 对调试器有好处,那么您应该开始使用 [System.Diagnostics.DebuggerDisplayAttribute]。
  4. 至于需要通过 String.Format() 和/或 Console.WriteLine 将对象转换为字符串的实现,他们可以推迟到 System.Convert.ToString(object) 并检查类似“IStringable”的内容,故障转移到类型的名称(如果未实现)。
  5. 正如克里斯托弗·埃斯特普(Christopher Estep)指出的那样,这是特定于文化的。

所以我想我独自一人在这里说我讨厌 System.Object 和所有它的虚拟方法。但我确实喜欢 C# 整体,总的来说,我认为设计师做得很好。

注意:如果您打算依赖 ToString() 重载的行为,我建议您继续定义 IStringable 接口。不幸的是,如果您确实需要该方法,则必须为该方法选择另一个名称。

more

我和我的同事刚刚就这个话题进行了交谈。我认为 ToString() 的另一个大问题是回答“它有什么用?”的问题。是显示文字吗?序列化文本?调试文本?完整的类型名称?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 object.ToString() 存在? 的相关文章

  • 从列表中获取数组而不进行堆分配

    我有一个列表 我想将其数组分配给一个属性 public void BuildMesh List
  • 如何将多种语言设置放入单个 .clang-format 文件中

    我想为 java javascript 和 c 创建一个 clang 格式 我知道如何转储单一语言的示例配置 但不知道如何合并这 3 个配置文件 有关如何将多种语言配置放入单个文件中的示例 BasedOnStyle LLVM IndentW
  • 如何在 Mac OS X 中获取 aio 信号处理程序的用户数据

    我尝试在 Mac OS X 下使用 aio 函数进行异步文件 IO 但在将某种形式的用户数据输入信号处理程序时遇到问题 这是设置操作的代码 class aio context public aio context int fildes bo
  • 从 Web 浏览器控件读取 Javascript 变量

    我正在尝试读取从表单上的 WebBrowser 控件加载和调用的 Javascript 变量的值 Example index html 引用名为 test js 的 javascript 在 test js 上 创建并填充了几个变量 然后i
  • JPG、DOC、PDF 等文件是否也编译成程序集?

    Q1 Does aspnet compiler exe将网站目录中包含的所有文件 甚至 JPG DOC 和 PDF 类型 编译成程序集 如果将图像添加到Web项目中的文件列表中 从而将它们添加到项目文件中 这些图像也会被VS编译成程序集吗
  • .NET 4.0 进程中的 clr.dll!LogHelp_TerminateOnAssert

    背景 我正在开发一个基于 WinForm 的 NET 4 0 桌面应用程序 该应用程序几乎没有线程和计时器 并对用户控件使用一些 GDI 处理 在我的开发过程中 我通常会查看 sysinternal 的 Process Explorer 以
  • 如何将值从控制器传递到asp.net中的视图?

    我正在开发一个应用程序 我需要将用户名的值从控制器传递到视图 我尝试了 ViewData 中给出的http msdn microsoft com en us library system web mvc viewdatadictionary
  • std::function 中参数的自动动态转换

    我们有多态类 A 和 B 例如 struct A virtual A struct B final public A void f std cout lt lt f lt lt std endl 我想分配一个变量std function
  • 使用日期时间作为文件名并随后解析文件名?

    我正在将文件写入硬盘 文件名是这样构建的 String Format 0 yyyy MM dd hh mm ss txt DateTime Now 例如 文件名是 2010 09 20 09 47 04 txt 现在我想在下拉列表中显示这些
  • 对于相同的数据库对象,实体框架对象引用是否相同

    如果我从不同位置查询 逻辑上 在数据库中 相同的对象 实体框架是否返回相同的对象引用 例如 我查询了名为 Joe Black 的客户 并假设现在我知道数据库中只有一个 Joe Black Customer c select blabla w
  • ASPNET MVC - 使用具有相同签名的新助手覆盖 Html.TextBoxFor(model.property)?

    我想用我自己的助手重写 Html TextBoxFor 该助手具有完全相同的签名 当然 但名称空间不同 这是否可能 如果可以 如何实现 原因是我在现有的应用程序中有 100 多个视图 并且我想更改 TextBoxFor 的行为 以便在属性具
  • JsonSerializer.Deserialize 失败

    考虑代码 using System using System Text Json public class Program public static void Main int id 9 string str id id var u Js
  • 为什么%c前面需要加空格? [复制]

    这个问题在这里已经有答案了 下面的代码一编译就给出了奇怪的o p main char name 3 float price 3 int pages 3 i printf nEnter names prices and no of pages
  • UWP 关闭信息亭模式

    我有一个发布到 Windows 应用商店的 UWP 应用程序 并且该应用程序可以启动进入信息亭模式 分配访问权限 它工作得很好 但我尝试在应用程序上创建一个按钮来关闭信息亭模式并返回到 Windows 登录屏幕 我尝试了文档中给出的代码 h
  • 为什么转发引用与右值引用具有相同的语法?

    我刚刚对这些 相当 新的功能做了一些研究 我想知道为什么 C 委员会决定为它们引入相同的语法 看来开发人员不必要浪费一些时间来理解它是如何工作的 而一种解决方案可以让我们思考进一步的问题 就我而言 它是从问题开始的 可以简化为 includ
  • 在memcpy缓冲区UB上使用reinterpret_cast吗?

    给定代码 struct A auto obj new A std vector
  • Outlook 插件:从选定的日历中获取元素

    我正在创建 Outlook 加载项 我想知道如何从选定的日历中获取元素 例如 我需要从名为 myCalendar 的日历中获取所有约会项目 现在 我可以从所有日历中获取所有约会项目 谢谢你 这些额外的日历作为主日历文件夹的子文件夹提供 所以
  • 迭代非增量枚举

    在你问之前 我已经looked https stackoverflow com questions 261963 c iterate through an enum and looked https stackoverflow com qu
  • C++ 中的无符号双精度?

    为什么 C 不支持无符号双精度语法 因为典型的浮点格式不支持无符号数 例如 参见此 IEEE 754 格式列表 http en wikipedia org wiki IEEE 754 2008 Formats 添加通用硬件不支持的数字格式只
  • 如何检查应用程序的 .NET 版本?

    除了在仅具有 NET Framework 版本 3 5 的计算机上运行之外 如何检查 NET 应用程序的版本 NET 框架版本控制在 NET 2 0 之后变为 foobar 一个应用程序的目标是CLR版本 它使用 EXE 的程序集元数据来实

随机推荐

  • 以编程方式使用 Sim1 或 Sim2 发送短信的选项

    我有一部带有 2 张 SIM 卡的 Android 手机 我想使用 Sim1 或 Sim2 发送短信 默认情况下 消息是从 sim1 发送的 但我想从 sim2 发送短信 是否可以设置使用Sim1或Sim2发送短信 如果有一个设置选项可以使
  • C++ 中的 getline() - 不需要 _GNU_SOURCE?

    首先 我对 C 还很陌生 我相信getline 不是标准 C 函数 所以 define GNU SOURCE需要使用它 我现在使用 C g 告诉我 GNU SOURCE已经定义 g Wall Werror parser cpp parser
  • 使用 maven 构建 apk 时出现 ClassNotFoundException

    我想在 Android 开发中切换到 Maven 进行构建过程 我跟着http www sonatype com books mvnref book reference android dev sect archetype html htt
  • 在 matplotlib 中,为什么用细线绘图更快?

    我今天偶然发现了这一点 如果线宽小于 1 0 在 matplotlib 中绘制线条似乎要快得多 我只在Mac上测试过这个 但效果似乎很强 例如 如果您尝试此代码 您将发现线宽为 0 5 时数据绘制速度比线宽 1 0 快约 10 倍 impo
  • 如何使 org-protocol 在 Openbox 上工作?

    I tried 说明 http orgmode org worg org contrib org protocol html 我正在使用 FirefoxLubuntu https en wikipedia org wiki Lubuntu
  • 在c++中将高斯曲线拟合到某个直方图峰值

    我有两个关于将高斯曲线拟合到直方图峰值的问题 我的第一个问题是一个非常基本的问题 如何将高斯曲线拟合到整个直方图 这是否仅仅意味着我必须找出并计算直方图的平均值 和偏差 并将它们放入高斯曲线的公式中 下面的例子正确吗 假设 仅作为示例 我有
  • CSS 弹性框最后一个空格被删除

    通过设置display的一个项目到flex我发现最后一个空格已从文本字符串中删除 div class has flex Some text a href link Link a div Becomes div class has flex
  • 有没有办法只在 Tomcat/Wildfly/Glassfish 启动时运行方法/类?

    我需要在 Tomcat 启动时删除临时文件 包含临时文件的文件夹的传递位于 applicationContext xml 中 有没有办法只在 Tomcat 启动时运行方法 类 你可以写一个ServletContextListener它从调用
  • iOS SDK 中的通知中心与委托

    为什么 Apple 选择使用委派来进行 SDK 对象之间的某些通信 并为其他对象将通知发布到通知中心 特别是 我正在考虑来自 UIWindow 的一组键盘外观通知 是否因为通知中心系统意味着多个对象可以使用键盘外观操作作为触发器来更改其状态
  • Clojure - 返回类型的调度? (与 Haskell 类型类一样具有表现力)

    这是一个关于 Clojure 与 Haskell 等其他语言的表达能力的问题 更广泛的问题是解决表达问题 http en wikipedia org wiki Expression problem 这个问题 https stackoverf
  • Flutter const 与 const 构造函数

    直到今天我还没有看到这个 dart 代码建议 我很高兴遵循最佳实践 但说实话 这在没有构造函数的有状态小部件中出现是没有意义的 我认为这可能与 immutable 注释有关 但似乎并非如此 而且 dart 文档也没有真正的帮助 Dart 文
  • JSONParser 和 JSONRenderer 之间的区别

    我正在经历Django Rest框架教程 http www django rest framework org tutorial 1 serialization 关于我陷入困境的序列化JSON渲染器 and JSON解析器 下面是那里提到的
  • 以编程方式创建 Spring 上下文时如何设置活动配置文件?

    tl dr 如何基于基于注释的配置类创建 Spring 上下文 同时提供活动配置文件 我正在尝试使用带有使用注释指定的配置的类来创建 Spring 上下文 org springframework context ApplicationCon
  • 为什么 std::function 可以使用具有不同返回类型的 lambda 来构造?

    下列编译良好 http melpon org wandbox permlink aO3eLLNUYZ3ucxcx include
  • C - 在多线程进程中 exec 是否必须立即跟随 fork ?

    情况 我有一个用 C 编写的多线程程序 如果其中一个线程分叉 则使用 exec 将子进程替换为另一个线程 并且父进程等待子进程退出 Problem 通过 fork 创建子进程后 有几行代码编译要在以下 exec 命令中使用的参数 假设我是否
  • 有没有办法让 JScience 输出为更“人类友好”的格式?

    当我对 JScience Amount 对象使用 toString 时 我得到如下结果 7 5 4 4E 16 mph 这并不可怕 但我真的希望它输出如下内容 7 5 miles per hour 是否有捷径可寻 edit 只是为了澄清 我
  • 虚拟、覆盖、新建和密封覆盖之间的区别

    我对 OOP 的一些概念很困惑 virtual override new and sealed override 谁能解释一下这些差异吗 我很清楚 如果要使用派生类方法 可以使用override关键字使得基类方法将被派生类覆盖 但我不确定n
  • Python 记录器不工作

    我尝试使用Python中的日志记录来写一些日志 但奇怪的是 只有error将被记录 info无论我设置哪个级别都会被忽略 code import logging import logging handlers if name main lo
  • 如何在Python中获取平面图的外部轮廓?

    获得平面图外部轮廓的最佳方法是什么 蛇算法效果不佳 因为某些平面图太凸 您只需要在查找轮廓时调整灰度图像的阈值以包含灰色虚线路径 由于输入图像的主要部分是白色 因此我们可以选择接近255的阈值 例如230 然后查找轮廓阈值化 您可以使用cv
  • 为什么 object.ToString() 存在?

    拥有一个不是更加优雅和整洁吗 IStringable界面 谁需要这个Type FullName对象返回给我们 EDIT 每个人都一直问为什么我认为它更优雅 嗯 就像这样 对象将具有 CompareTo 方法 而不是 IComparable