C# toString()是否仅对调试有用?

C# toString()是否仅对调试有用?,c#,java,tostring,C#,Java,Tostring,当然,除此之外,它们还用于原语。我看到的大多数(如果不是全部)实现仅从程序员的角度来看是有用的 编辑:我知道我应该重写默认行为,这就是我提到实现的原因:)。我确实得到了在一些组件中重写它的价值,这些组件需要GUI中的字符串表示。然而,至少在JDK中,我看到了很多只在需要调试对象实例时才使用的实现 为什么它植根于对象类,因为这似乎只对GUI/调试内容有用?是否还有其他用途我不知道?不,关键是您应该覆盖ToString()的默认实现以使其有用ToString()是将某些内容的值输出回UI的好方法

当然,除此之外,它们还用于原语。我看到的大多数(如果不是全部)实现仅从程序员的角度来看是有用的


编辑:我知道我应该重写默认行为,这就是我提到实现的原因:)。我确实得到了在一些组件中重写它的价值,这些组件需要GUI中的字符串表示。然而,至少在JDK中,我看到了很多只在需要调试对象实例时才使用的实现


为什么它植根于对象类,因为这似乎只对GUI/调试内容有用?是否还有其他用途我不知道?

不,关键是您应该覆盖
ToString()
的默认实现以使其有用
ToString()
是将某些内容的值输出回UI的好方法

一个简单的例子是,如果您有一个包含三个字符串(First、Middle、Last)的Name类。您可以使用一个
ToString()
方法为UI格式化它,例如:“Last,First Middle”

或者存储数学运算的类(值Left=2、Right=3、Result=6和运算符enum=Multiply)。调用
ToString()
获取“2*3=6”

但是,可能更常见的是有各种不同的
ToString()
方法,比如.NET
DateTime
类。(
ToSortDateString()
ToLongDateString()
ToLongTimeString()
,…)

编辑:至于为什么它根在
对象
类中,这仅仅是因为
ToString()
对任何东西都是有效的操作

此外,字符串可以是数据类型或数据使用者之间封送的好方法,因为它(实际上)保证是可解析的,并且不需要额外的编码或处理。

ToString()在将任何对象输出到字符串时也被.NET Framework隐式调用

Console.WriteLine("My Object is" + object.ToString());
相当于

Console.WriteLine("My Object is" + object);
因为ToString()是隐式调用的


我相信,尽管我不确定,调试器是否使用它来获取对象的“值”。这可能相当方便,尽管有限。在大多数情况下,编写自己的调试器可视化工具是一个更好的主意。

toString()在需要对象的字符串表示时非常有用。出于调试目的,这自然会发生,但也可以有效地将操作结果输出给用户

例如,假设您有一个处理复数的复杂类。如果您想以3+2i这样的格式将它们打印给用户,那么如果他们定义toString()就很方便了,因为您不必每次都写入格式,而且输出将是一致的。如果要更改该表示,例如更改为3+2j,只需在复杂类中触摸toString()方法


因此,toString()也不是为了调试,而是获得对象一致的字符串表示的好方法。

在AS3上,我必须将2D数组转换为1D数组。最快(运行速度)和最简单(编码时间)的解决方案是:

var new1DArray:Array = the2DArray.toString().split(",");
令人惊讶的是,它实际上正在按预期工作,而且速度也相当快

用于

  • Gui(使用PropertyGrid时的复杂属性,表单标题文本)
  • 数据绑定(这就是它的工作方式)
  • 以及任何其他字符串输出。

    这可能不是“有意”使用的,但我已将其用于数据序列化

    storeToHardDrive(studentList.ToString());
    

    我个人的偏好是,toString()应该永远不要用于调试以外的任何事情。如果要为对象生成字符串,请提供一个单独的方法来清楚地记录您的意图(getName()、getDescription()等)。永远不要依赖于toString()的实现

    问题是,许多开发人员将toString()视为调试级别的字符串,而不考虑对其进行任何更改(例如添加或删除新字段时)。见鬼,一些自动toString()构建器使用反射从字段生成toString()

    多年来,我发现这种偏好对我很有帮助。

    我经常使用ToString()作为日期时间格式


    除了其他人已经说过的以外,在使用调用ToString()的控件时,重写ToString()也很有用。例如,组合框:

    myComboBox.Items.Add(new MyClass());
    // now, whatever ToString() returns is shown in the
    // ComboBox, but you can get the object back by through
    // the SlectedItem property.
    

    我所能说的是,当我更改类的toString以显示一些额外的调试信息时,代码中断了

    所讨论的代码是一个GUI库,它决定使用toString的值作为一些内部内容(这是几年前的事了……我忘了它到底是什么)。最终的结果是我不再使用这个库了

    我想说的是,由于一大群人认为toString用于调试(不管您认为它应该用于什么目的),因此利用它返回的值进行任何编程(如解析)或向用户显示都是有问题的

    如果您100%地控制toString方法,那么请尽一切可能做您想做的事情


    因此,要回答这个问题,no-toString不仅对调试有用,还可以用它做任何事情。但是,如果toString的更改方式让您不高兴,也不要感到惊讶。

    首先,
    toString
    方法应该返回对象的可读文本表示

    此问题在第10项中提出:始终覆盖
    toString

    它引用了该方法的:

    结果应该是一个简洁但不复杂的过程 信息表示法,即 一个人容易阅读

    除了调试之外,在将对象加载到或中时,重写类的
    toString
    方法也很有用,默认情况下,将使用
    toString
    方法在列表或表格中以文本形式显示对象

    例如,在我的例子中,我覆盖了t