ü 要在公用API中优先使用集合,而不是优先使用数组。
û 不要使用只读的数组字段。
public static readonly char[] chars = { '<', '>', '=' };//bad
ü 考虑使用不规则数组,而不要使用多维数组。
//good
int[][] jaggedArray={
new int[]{1,2,3},
new int[]{1,2,3,4,5},
new int[]{8}
};
//bad
int[,] multiDimArray={
{1,2,3,4},
{2,3,4,5},
{4,0,0,0}
};
ü 要在命名自定义attribute类时添加“Attribute”后缀。
ü 要在定义自己的attribute时使用AttributeUsageAttribute。
ü 要为可选参数提供可设置的属性。
ü 要为必填参数提供只读属性。
ü 要提供构造函数参数来对鼻涕 参数进行初始化。
û 避免提供构造函数参数来对与可选参数对应的属性进行初始化。
û 避免对自定义attribute的构造函数进行重载。
ü 要尽可能将自定义attribute类密封起来。这样会使查找attribute更快。
[AttributeUsage(
AttributeTargets.Class | AttributeTargets.Method,
AllowMultiple = true, Inherited = false)]
public class LastModifiedAttribute : Attribute
{
private readonly DateTime dateModified;
private readonly string changes;
private string issues;
public LastModifiedAttribute(string dateModified, string changes)
{
this.dateModified = DateTime.Parse(dateModified);
this.changes = changes;
}
public DateTime DateModified
{
get { return dateModified; }
}
public string Changes
{
get { return changes; }
}
public string Issues
{
get { return issues; }
set { issues = value; }
}
}
û 不要在公用API中使用弱类型集合。
û 不要在公用API中使用ArrayList或List<T>。当客户代码修改时无法收到消息。如Add()方法
û 不要在公用API中使用Hashtable或Dictionary<TKey,TValue>。
û 不要使用IEnumerator<T>、IEnumerator或实现了这两个接口之一的任何其他类型,除非是作为GetEnumerator方法的返回值。
û 不要在同一个类型中同时实现IEnumerator<T>和IEnumerable<T>。对非泛型接口IEnumerator和Enumerable来说也同样如此。类型要么是集合,要么是枚举器,不能两者都是。
ü 要用最泛的类型来作为参数类型。大多数的集合为参数的成员都使用IEnumerable<T>接口。
public void PrintNames(IEnumerable<string> names)
{
foreach(string name in names)
Console.WriteLine("name:{0}",name);
}
û 避免使用ICollection<T>或ICollecton来做参数。
ICollection<T> : IEnumerable<T>, IEnumerable
ICollection : IEnumerable
û 不要提供可设置的集合属性。
public Collection<Persons> Persons{get{...},set{...};}//bad
ü 要用Collection<T>或其子类作为属性或返回值来表示可读写的集合。
public Collection<string> Legs
{
get;
}
ü 要用ReadOnlyCollection<T>或其子类作为属性或返回值来表示只读的集合。
public ReadOnlyCollection<string> Eyes
{
get{return new ReadOnlyCollection<string>(eyes);}
}
ü 考虑使用泛型集合基类的子类,而不要直接使用该集合。
public class CowCollection:Collection<Cow>{...}
ü 要用Collection<T>或ReadOnlyCollecton<T>的子类来作为常用方法和常用属性的返回值。
ü 如果集合中存储的元素都有独一无二的键值,考虑使用有键集合(keyed collection),。
û 不要从集合属性或以集合为返回值的方法中返回null,替代方法是返回一个空集合或空数组。
û 不要让属性返回“snap collection”,属性应该返回“live collection”。表示某个时间点的状态的集合称为“snapshot Collection”,如数据库的查询。始终表示当前状态的集合称为live collection。
ü 要用snapshot collection或live IEnumerable<T>来表示不稳定的集合。
û 不要继承自非泛型的集合基类,比如CollectionBase,要使用Collection<T>。实际上,很多情况下,我们都不会从CollectionBase中派生类。知道内部的工作原理是好事,因为List<T>以相同的方式工作,但CollectionBase是向后兼容的。使用CollectionBase的唯一场合是要更多的控制向类的的用户展示的成员。如果希望集合类的Add()方法使用内部访问修饰符,则使用CollectionBase是最佳选择。
ü 要为强类型的非泛型集合实现IEnumerable<T>。如果合理,还可以考虑实现ICollection<T>甚至IList<T>。
û 如果类型的API很复杂,而且与集合的概念无关,避免为类型实现集合接口。
ü 要在为实现了IEnumerable的类型命名是添加“Collection”后缀。
ü 要在为实现了IDictionary或IDictionary<TKey,TValue>的类型命名是添加“Dictionary”后缀。
û 避免给集合抽象的名字添加代表其具体实现的后缀,比如“LinkedList”或“Hashtable”。
ü 考虑用集合元素的类型名作为集合名字的前缀。
ü 考虑给只读集合的名字添加“ReadOnly”前缀。
ü 要优先使用集合,而不是优先使用数组。
ü 考虑在底层API中使用数组,以降低内存的消耗并提高性能。
ü 要使用字节数组,而不要使用字节集合。
public Collection<byte> ReadBytes(){...}//bad
public byte[] ReadBytes(){...}//good
û 不要将数组用于属性。
û 不要实现ICloneable。
û 不要在公用API中使用ICloneable.
ü 考虑为需要克隆机制的类型定义Clone方法。一定要在文档中明确说明该方法是深复制还是浅复制。
ü 要为值类型实现IEquatable<T>。主要从性能考虑,object.Equals会导致装箱操作。
ü 要在实现IEquatable<T>.Equals时,同样遵循为覆盖Object.Equals而制定的规范。
ü 要在实现IEquatable<T>的同时覆盖Object.Equals。
ü 考虑在实现IEquatable<T>的同时重载“operator ==” 和“Operator !=”。
ü 要在实现IComparable<T>的同时实现IEquatable<T>。
ü 考虑在实现IComparable<T>的同时重载比较操作符(<、>、<=、>=)。
实现IDisposable就是实现Dispose模式。
Dispose模式:
public class Base : IDisposable
{
public void Dispose()
{
this.Dispose(true);
GC.SupressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// 托管类
}
// 非托管资源释放
}
~Base()
{
this.Dispose(false);
}
}
public class Derive : Base
{
protected override void Dispose(bool disposing)
{
if (disposing)
{
// 托管类
}
// 非托管资源释放
base.Dispose(disposing);
}
}
7.7.1. Object.Equals
ü 要在覆盖Object.Equals方法时,遵守它定义的协定。
协定内容:
x.Equals(x) 返回true。
x.Equals(y)的返回值与y.Equals(x)相同。
如果(x.Equals(y)&&y.Equals(z))返回true,那么x.Equals(z)也应该返回true。
只要对象x和对象y未被修改,那么连续调用x.Equals(y)应该返回相同的值。
x.Equals(null)应该返回false。
ü 要在覆盖Equals方法的同时,覆盖GetHashCode方法。
ü 考虑在覆盖Object.Equals方法的同时实现IEquatable<T>接口。
û 不要从Equals方法中抛出异常。
ü 要覆盖值类型的Equals方法。
ü 要通过实现IEquatable<T>来提供一个以值类型本身为
分享到:
相关推荐
公路工程标准施工招标文件第七章—技术规范(2018年版).doc
公路工程标准施工招标文件是指导公路建设项目施工过程的重要文件,其中第七章——技术规范更是核心内容,它详细规定了工程的技术要求、施工方法、质量控制、安全规定等关键环节。2018年版最终稿是对之前版本的修订和...
《使用Java理解程序逻辑》第七章,主要涵盖了Java编程中的一些关键概念和技巧,旨在帮助读者深入理解如何通过Java语言构建有效的程序逻辑。本章内容可能包括但不限于控制流程、循环结构、条件判断、函数(方法)的...
本教程主要涵盖第7章至第12章的内容,这六个章节深入讲解了数据库系统的多个关键概念和技术,包括系统实现技术、对象数据库系统、分布式数据库系统、中间件技术、XML技术和现代信息集成技术。 第7章“系统实现技术...
第七章技术规范.pdf
《第七章使用携带型仪器仪表进行测量工作的规定》详述了在电力系统中进行测量作业时的安全措施和技术规范。这份规定主要分为四个部分,分别针对核相工作、使用电压互感器或电流互感器、音叉型和钳型电流表的测量以及...
总的来说,软件工程第七章强调了实现阶段的细节处理,包括合理选择编程语言、遵循良好的编程风格以及规范的数据说明,这些都是确保软件质量、提高代码可读性和可维护性的关键因素。忽视这些细节可能导致后期维护困难...
数据库原理第七章 关系数据库规范化理论课件 较完整详细,帮助理解
在第七章的编程题中,可能需要编写代码读取或写入文件,了解File、InputStream、OutputStream、BufferedReader、PrintWriter等相关类的使用。 9. **泛型**: 泛型允许在类、接口和方法中指定类型的参数,增强了...
**标题:“我翻译的JSTLv1.2规范(第七章)”** JSTL,全称为JavaServer Pages Standard Tag Library,是Java服务器页面标准标签库,它为JSP开发提供了一系列预定义的标签,用于简化网页开发,提高代码的可读性和可...
在“S2-3使用JavaScript增强交互效果第七章到第十章课件及课后作业答案”这个压缩包中,涵盖了JavaScript学习的重要部分,帮助学生深入理解和掌握这门语言的核心概念和技术。 第七章通常会涉及“JavaScript基础语法...
数据库系统原理第七章答案.ppt 本章教学目标是使学生了解关系模式规范化的必要性,理解函数依赖、多值依赖及其关系范式定义,掌握关系范式判断方法。教学重点是关系模式规范化、函数依赖、多值依赖、1-4NF的定义,...
【文档标题】:安全管理规范第七章 - 财务安全治理 【文档描述】:这份文档详述了学校财务安全的管理规范,包括现金管理、银行存款管理、有价证券管理、票据管理和审核复核管理等多个方面,确保学校财务安全运行。 ...
**第七章:面向对象高级特性** 这一章深入探讨了接口、内部类、抽象类以及泛型等高级主题。接口用于定义行为规范,内部类可以提供更灵活的封装,抽象类作为其他类的模板,泛型则提高了代码的类型安全性。 通过以上...
《第二部分第六章第七章》主要聚焦于这一领域,它详细介绍了电力系统中的安全用电知识,重点阐述了配电设备、线路以及户内外设施的标志规范,这些规范是确保电气作业安全的关键。 配电设备的安全标志对于保障电力...
161023第七章电子商务产品交付法律规范.ppt
第一章“引言”介绍了USB的基本概念和发展背景。USB的设计目标是为了简化设备的连接,提供即插即用和热插拔功能,同时提高数据传输速率。这一章涵盖了USB的架构、历史发展、标准制定组织以及USB 2.0相对于前一版本的...
《印章使用管理办法》是针对内蒙古第一电力建设工程公司项目部印章管理和使用制定的一套规范,旨在确保印章的安全和正确使用,防止因管理不当造成的损失。以下是对该管理办法的详细解析: 1. **目的**:该制度的...
《印章使用登记表》是企业内部管理中一个重要的文档,主要用来规范印章的使用流程,确保印章的安全性和合法性。在日常工作中,印章是企业对外进行业务活动、签署合同的重要凭证,具有法律效力,因此,对其使用进行...