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()
方法,比如.NETDateTime
类。(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(",");
令人惊讶的是,它实际上正在按预期工作,而且速度也相当快 用于
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