Effective C#原则5:始终提供ToString()

在.Net世界里,用得最多的方法之一就是System.Object.ToStrying()了。你 应该为你所有的客户写一个“通情达理”的类(译注:这里是指这个 类应该对用户友好)。要么,你就迫使所用类的用户,去使用类的属性并添加一 些合理的易读的说明。这个以字符串形式存在,关于你设计的类的说明,可以很 容易的向你的用户显示一些关于对象的信息到:Windows Form里,Web Form里, 控制台输出。这些字符说明可以用于调试。你写的任何一种类型,都应该合理的 重写这个方法。当你设计更多的复杂的类型时,你应该实现应变能力更强的 IFormattable.ToString(). 承认这个:如果你不重写(override)这个常规的方 法,或者只是写一个很糟糕的,你的客户将不得不为你修正它。

System.Object版的ToString()方法只返回类型的名字。这并没有太多有 用的信息:“Rect”,“Point”,“Size”并 不会如你所想的那样显示给你的用户。但那只是在你没有为你的类重写 ToString()方法时得到的。你只用为你的类写一次,但你的客户却会使用很多次 。当你设计一个类时,多添加一点小小的工作,就可以在你或者是其他人每次使 用时得到回报。

(译注:废话!)

============= =========

这一原则就不翻译了,看的有点郁闷。就是 ToString()的几个重写版本。以及一些格式化输出。我觉得本书不应该讨论这些 入门级的内容,所以只是读了一遍,就没有全部翻译。

大家知道要重写 它就行了,最好是提供几个重载版本。回头有时间再翻译这一原则的其它内容。

给一点个人建议,一般不会在一个类的ToString上提供很多的说明,给 一个名字就已经足够了,然后加一个SDK帮助。更多时候,在后面添加成员类的 说明。我就在一个第三方库的ToString上看到很严谨的结构,都是在类名后面, 添加一些内容和重要属性的说明。

=========================================补译:

让我们来 考虑一个简单的需求:重写System.Object.ToString()方法。你所设计的每一个 类型都应该重写ToString()方法,用来为你的类型提供一些最常用的文字说明。 考虑这个Customer类以及它的三个成员(fields)(译注:一般情况,类里的 fields译为成员,这是面向对象设计时的概念,而在与数据库相关的地方,则是 指字段):

public class Customer
{
  private string  _name;
  private decimal _revenue;
  private string  _contactPhone;
}

默认继承自System.Object的ToString()方法会返回"Customer"。 这对每个人都不会有太大的帮助。就算ToString()只是为了在调试时使用,也应 该更灵活(sophisticated)一些。你重写的ToString()方法应该返回文字说明, 更像是你的用户在使用这个类一样。在Customer例子中,这应该是名字:

public override string ToString()
{
 return _name;
}

时间: 2024-11-22 21:55:59

Effective C#原则5:始终提供ToString()的相关文章

Effective C#原则16:垃圾最小化

垃圾回收器对内存管理表现的非常出色,并且它以非常高效的方法移除不再 使用的对象.但不管你怎样看它,申请和释放一个基于堆内存的对象总比申请和 释放一个不基于堆内存的对象要花上更多的处理器时间.你可以给出一些严重的 性能问题,例如应用程序在某个方法内分配过量的引用对象. 你不应该 让垃圾回收器超负荷的工作,为了程序的效率,你可以使用一些简单的技巧来减 少垃圾回收器的工作.所有的引用类型,即使是局部变量,都是在堆上分配的. 所有引用类型的局部变量在函数退出后马上成为垃圾,一个最常见的"垃 圾"

Effective C#原则10:明白GetHashCode()的缺陷

这是本书中唯一一个被一整个函数占用的原则,你应该避免写这样的函数. GetHashCode()仅在一种情况下使用:那就是对象被用于基于散列的集合的关键 词,如经典的HashTable或者Dictionary容器.这很不错,由于在基类上实现的 GetHashCode()存在大量的问题.对于引用类型,它可以工作,但高效不高:对 于值类型,基类的实现经常出错.这更糟糕.你自己完全可以写一个即高效又正 确的GetHashCode().没有那个单一的函数比GetHashCode()讨论的更多,且令人 困惑

Effective C#原则42:使用特性进行简单的反射

当你创建了一个与反射相关的系统时,你应该为你自己的类型,方法,以及 属性定义一些自己的特性,这样可以让它们更容易的被访问.自定义的特性标示 了你想让这些方法在运行时如何被使用.特性可以测试一些目标对象上的属性. 测试这些属性可以最小化因为反射时可能而产生的类型错误. 假设你须 要创建一个机制,用于在运行时的软件上添加一个菜单条目到一个命令句柄上.这个须要很简单:放一个程序集到目录里,然后程序可以自己发现关于它的一些 新菜单条目以及新的菜单命令.这是利用反射可以完成的最好的工作之一:你的 主程序须

Effective C#原则40:根据需求选择集合

"哪种集合是最好的?"答案是:"视情况而定." 不同的集合有不同的性能,而且在不同的行为上有不同的优化..Net框架支持很 多类似的集合:链表,数组,队列,栈,以及其它的一些集合.C#支持多维的数 组,它的性能与一维的数组和锯齿数组都有所不同..Net框架同样包含了很多特 殊的集合,在你创建你自己的集合类之前,请仔细参阅这些集合.你可以发现很 多集合很快,因为所有的集合都实现了ICollection接口.在说明文档中列出了 所有实现了ICollection接口的集合

Effective C#原则37:使用标准的配置机制

我们要寻求一种避免直接写代码的应用程序配置和信息设置方法,我们已经 创建了多种不同的策略来存储配置信息.而我们是要寻求一种正确的方法,我们 要不断提高和改我们的想法,关于哪里是放置这些信息的好地方.INI文件?这 是Windows3.1做的事,配置信息的结构是受限制的,而且在文件名上可能还会与 其它程序程序相冲突.注册表?是的,是这个正确的想法,但它也有它的限制. 乱七八糟的程序可能会通过在注册表里写一些错误信息来严重破坏计算机.正因 为写注册表存在危险,一个应用程序必须有管理员权限来写注册表的

Effective C#原则35:选择重写函数而不是使用事件句柄

很多.Net类提供了两种不同的方法来控制一些系统的事件.那就是,要么添 加一个事件句柄:要么重写基类的虚函数.为什么要提供两个方法来完成同样的 事情呢?其实很简单,那就是因为不同的情况下要调用为的方法.在派生类的内 部,你应该总是重写虚函数.而对于你的用户,则应该限制他们只使用句柄来响 应一些不相关的对象上的事件. 例如你很了一个很不错的Windows应用程 序,它要响应鼠标点下的事件.在你的窗体类中,你可以选择重写OnMouseDown ()方法: public class MyForm :

Effective C#原则32:选择小而内聚的程序集

这一原则实际应该取这个名字:"应该创建大小合理而且包含少量公共 类型的程序集".但这太沉长了,所以就以我认为最常见的错误来命名: 开发人员总是把所有的东西,除了厨房里水沟以外(译注:夸张说法,kitchen sink可能是个口语词,没能查到是什么意思,所以就直译了.),都放到一个程 序集.这不利于重用其中的组件,也不利于系统中小部份的更新.很多以二进制 组件形式存在的小程序集可以让这些都变得简单. 然而这个标题对于程 序集的内聚来说也很醒目的.程序集的内聚性是指概念单元到单个组件的职责

Effective C#原则27:避免使用ICloneable

ICloneable看上去是个不错的主意:为一个类型实现ICloneable接口后就可 以支持拷贝了.如果你不想支持拷贝,就不要实现它. 但你的对象并不 是在一个"真空"的环境中运行,但考虑到对派生类的些影响,最好 还是对ICloneable支持.一但某个类型支持ICloneable, 那么所有的派生类都必 须保持一致,也就是所有的成员必须支持ICloneable接口或者提供一种机制支持 拷贝.最后,支持深拷贝的对象,在创建设计时如果包含有网络结构的对象,会 使拷贝很成问题.IClon

Effective C#原则26:用IComparable和IComparer实现对象的顺序关系

你的类型应该有一个顺序关系,以便在集合中描述它们如何存储以及排 序..Net框架为你提供了两个接口来描述对象的顺序关系:IComparable 和 IComparer.IComparable 为你的类定义了自然顺序,而实现IComparer接口的类 可以描述其它可选的顺序.你可以在实现接口时,定义并实现你自己关系操作符 (<,>,<=,>=),用于避免在运行时默认比较关系的低效问题.这 一原则将讨论如何实现顺序关系,以便.Net框架的核心可以通过你定义的接口对 你的类型进行排序.这