它总是适当的,但仔细考虑背后的意图你显示
一个更好的问题会是什么问:
为什么一个重写的ToString()?
ToString()是进入对象状态的窗口。作为要求,强调状态。像Java/C#这样强大的OOP语言通过将所有内容封装在一个类中来滥用OOP模型。想象一下,你用一种不遵循强OOP模型的语言来编码;考虑你是否使用类或函数。如果将它用作函数(即动词,动作),并且只在输入/输出之间暂时维护内部状态,则ToString()不会添加值。
和其他人一样,考虑什么你用ToString()输出是很重要的,因为它可以被调试器或其他系统使用。
我喜欢将ToString方法想象成对象的--help参数。它应该是简短的,可读的,明显的,并且易于显示。它应该显示什么对象是而不是它确实。所有这一点让我们考虑一下......
使用案例 - 解析TCP包:
而不是应用级别唯一的网络捕获但更像是一个PCAP捕获肉的东西。
您只想为TCP层重载ToString(),以便将数据打印到控制台。它会包括什么?你可以去疯狂并解析所有的TCP细节(即TCP是复杂的)...
其中包括:
- 源端口
- 目标端口
- 序列号
- 确认编号
- 数据偏移量
- 标志
- 窗口胶印
- 校验
- 紧急指针
- 选项(我不甚至要去那里)
但是你想接收所有的垃圾,如果你分别致电TCP.ToString( )100个数据包?当然不会,这会造成信息超载。最简单的和显而易见的选择,也是最明智的...
揭露什么人希望看到:
我喜欢懂事输出对于人类来说很容易解析,但是YMMV。
TCP:[destination:000, source:000]
没有什么复杂的,输出不是用于解析的机器(即除非人们滥用你的代码),其目的是为了人类的可读性。
但是我之前提到过的那些多汁信息的其余部分怎么样也没有用? )我会到,但第一...
的ToString(的所有时间
最有价值的和未充分利用的方法之一,有两个原因:
- 人不不明白ToString()是什么
- 基础'对象'类缺少另一个同样重要的字符串方法。
原因1 - 不要滥用的ToString的用处():
很多人使用的ToString()拉一个对象的简单字符串表示。 C#手册甚至规定:
ToString是.NET Framework中的主要格式化方法。它将对象转换为其字符串表示形式,以便适合显示。
显示,没有进一步处理。这并不意味着,拿我上面的TCP数据包的漂亮的字符串表示,并使用正则表达式:: cringe ::来拉取源端口。
right做事情的方法是,直接在SourcePort属性上调用ToString()(它是一个ushort,所以ToString()应该已经可用)。
如果您需要更强大的功能来打包复杂对象的状态以进行机器解析,则最好使用结构化序列化策略。
幸运的是,这样的策略是很常见的:
- ISerializable的(C#)
- 泡菜(蟒蛇)
- JSON(JavaScript或实现任何语言)
- SOAP
- 等...
注意:U您正在使用PHP,因为HERP-DERP,还有为::傻笑::
原因2的功能nless - toString()方法是不够的:
我还没有看到一个语言以此为核心,但我已经在野外看到并使用了这种方法的变体。其中一些
包括:
- ToVerboseString()
- 的ToString(详细=真)
基本上,应该人类要描述的TCP数据包的状态的那毛状乱七八糟可读性。为了避免“白费口舌”谈到TCP在#1情况下,我认为toString()和ToVerboseString()没有得到充分利用我“点手指” ......
使用案例 - 阵列:
如果您主要使用一种语言,那么您可能对该语言的方法感到满意。对于像我这样在不同语言之间跳跃的人来说,不同方法的数量可能令人不快。
也就是说,这让我恼火的次数大于每个印度教神的所有手指总和的总和。
有various箱子地方语言使用普通hacks和few这get它right。一些需要轮子重新发明,一些做浅转储,其他人做深转储,没有一个按照我希望他们的方式工作...
我要求的是一个非常简单的方法:
输出: '数组[X]' 或 '阵列[X] [Y]'
其中x是物品的在第一维和y的数量是多少第二维中的项目或表示第二维为锯齿状的某个值(最小/最大范围可能?)。
和:
print(array.ToVerboseString());
输出整她,一鼓作气漂亮地打印,因为我很欣赏漂亮的东西。
我们希望,这揭示了已经惹恼了我很长一段时间的话题的一些情况。至少我为PHPers撒了一点点巨魔诱饵来降低这个答案。
取决于如果你真的想用它来随时随地在UI中显示的对象,否则它通常只是用于调试 - 你会看到在VS的监视窗口中的ToString输出。 (但是你也可以通过类上的属性来实现它。)假设你有标题和输出,它看起来像这个程序使用它来使用Console.WriteLine(obj.GetToStringItemsHeadings)转储对象。 Console.WriteLine(obj);'或类似的。 – Rup 2012-04-23 09:38:48
我真的不明白这个问题。它可以做不同的事情吗?是。但是,你为什么要*以不同的方式做。 – 2012-04-23 09:38:49
我真的会跳过属性名称中的GetToString ...然后你会得到例如'Console.WriteLine(obj.ItemHeadings)' – Svish 2012-04-23 12:09:48