总是合适的,但请仔细考虑所显示内容的意图
更好的问题是:
为什么要覆盖ToString()?
ToString()是进入对象状态的窗口。强调国家作为要求。像Java / C#这样的OOP语言强烈地通过将所有内容封装在一个类中来滥用OOP模型。想象一下,您使用的代码不遵循强大的OOP模型。考虑要使用类还是函数。如果将其用作函数(即动词,动作)并且内部状态仅在输入/输出之间临时保持,则ToString()不会增加值。
像其他人所说的,是要考虑的重要的东西,你的输出与toString()方法,因为它可以通过调试程序或其他系统中使用。
我想将ToString方法想象为对象的--help参数。它应该简短,易读,明显且易于显示。它应该显示的对象是什么是不是它做。考虑到所有这些,让我们考虑一下...
用例-解析TCP数据包:
不是仅应用程序级的网络捕获,而是诸如pcap捕获之类的东西。
您只想为TCP层重载ToString(),以便可以将数据打印到控制台。它包括什么?您可能会疯狂地解析所有TCP详细信息(即TCP很复杂)...
其中包括:
- 源端口
- 目的端口
- 序列号
- 确认号码
- 数据偏移
- 标志
- 窗口偏移
- 校验和
- 紧急指针
- 选项(我什至不去那里)
但是,如果要对100个数据包调用TCP.ToString(),您是否想接收所有这些垃圾?当然不是,那将是信息过载。简单明了的选择也是最明智的选择。
揭露人们期望看到的东西:
我更喜欢人类易于解析的明智输出,但是YMMV。
TCP:[destination:000, source:000]
没什么复杂的,输出不是供机器解析的(即除非人们在滥用您的代码),其目的是为了人类可读。
但是,我之前讨论的所有其他多汁信息又没有用吗?我先说一下...
ToString()是有史以来最有价值和未充分利用的方法之一
有两个原因:
- 人们不明白ToString()是干什么的
- 基本的“对象”类缺少另一个同样重要的字符串方法。
原因1-不要滥用ToString()的有用性:
许多人使用ToString()拉取对象的简单字符串表示形式。C#手册甚至指出:
ToString是.NET Framework中的主要格式化方法。它将对象转换为其字符串表示形式,以便适合显示。
显示,不作进一步处理。这并不意味着用我上面的TCP数据包的漂亮字符串表示形式,并使用regex :: cringe ::拉出源端口。
在正确的做事方式是,调用toString()直接在源端口属性(BTW是一个USHORT这样的ToString()应该已经可用)。
如果您需要更强大的功能来打包复杂对象的状态以进行机器解析,那么使用结构化序列化策略会更好。
幸运的是,这样的策略非常普遍:
- 可序列化(C#)
- 泡菜(Python)
- JSON(JavaScript或实现它的任何语言)
- 肥皂
- 等等...
注意:除非您使用PHP,否则会因为:: snicker ::而导致使用herp-derp:
原因2-ToString()不够:
我还没有看到一种语言可以在核心实现它,但是我已经看到并使用了这种方法的各种变体。
其中一些包括:
- ToVerboseString()
- ToString(详细= true)
基本上,应该描述TCP数据包状态的混乱状况,以便于人类阅读。为了避免在讨论TCP时“打败一匹死马”,我将“指责”我认为ToString()和ToVerboseString()使用不足的#1情况。
用例-数组:
如果您主要使用一种语言,那么您可能会对这种语言的方法感到满意。对于像我这样在不同语言之间跳来跳去的人,各种各样的方法可能会令人讨厌。
就是说,这使我烦恼的次数大于每个印度教神的手指之和的总和。
有各种地方语言使用常见的情况的黑客和一些是得到它的权利。有些需要重新发明轮子,有些需要进行浅层倾卸,有些需要进行深层倾卸,但都没有按照我希望他们的方式工作...
我要的是一种非常简单的方法:
print(array.ToString());
输出:“ Array [x]”或“ Array [x] [y]”
其中x是第一维中的项目数,y是第二维中的项目数,或者表示第二维呈锯齿状的某个值(可能是最小/最大范围?)。
和:
print(array.ToVerboseString());
以漂亮的字体输出整个she-bang,因为我欣赏漂亮的东西。
希望这可以阐明一个困扰我很长时间的话题。至少我为PHPers撒了一些巨魔诱饵来否决这个答案。
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
或类似方法将对象转储出去。