一、 参数设计
要用类层次结构中最接近基类的类型来作为参数的类型,同时要保证该类型能够提供成员所需要的功能
假如我们要设计一个方法,把集合进行遍历并把每一项打印到控制台。像这样的方法应该以IEnumerable为参数,而不应该以其他为参数
Public void aaa(IEnumerable collection)
{
Foreach(object item in collection)
Console.WriteLine(item.ToString());
}
不要使用保留参数。
如果需要更多的参数,应该定义重载。
要把所有的输出参数放在所有以值和引用方式传递的参数的后面。
要在重载成员或实现接口时保持参数名一致。
a) 枚举和布尔参数的选择
如果使用枚举有助提高代码的可读性,那么应该使用枚举。
要使用枚举,如果不哪样做会导致参数中有两个,或者两个以上的布尔类型
不要使用布尔参数,除非百分百肯定绝对不需要两个以上值。
b) 参数的验证
对于可重用的程序库来说,对传递给成员的参数进行严格检查是至关重要的。虽然检查参数可能会对性能产生轻微影响,但是最终用户一般是愿意付出这样的代价的。因为他们能够得到更好的错误报告。而且只有在调用栈高处才能产生更好的错误报告。
如果在调用栈低处,那么函数所做的工作非常少,这样一来参数验证对性能的影响就是非常显著的,甚至是决定性的。
要验证传递给公有的,受保护的或者显示实现的成员的参数。如果验证失败,那么应该抛出System.ArgumentException或其他子类
(ArgumentException表示在向方法提供的其中一个参数无效时引发的异常。)
要抛出ArgumentNullException 如果传入的是null而该成员不支持null
要验证枚举参数
不要认为传入的枚举值会在枚举定义的范围内。CLR允许用户把任何整数值强制转换为枚
举类型值,即使该值在枚举类型中没有定义.
Public void PickColor(Color color)
{
If(Color> Color.Black || Color < Color.White)
Throw new ArgumentOutOfRangeException();
}
要清楚的知道,传入的可变参数可能会在验证后发生改变
如果该成员对安全性敏感,那么最好先制作一个副本,然后在对参数进行验证和处理
c) 参数的传递
避免使用输出参数和引用参数
因为着两个参数使用相对复杂,对使用者有一定要求。
如果需要从调用中返回几笔数据,那么应该把数据封装到类或者结构中。
比如执行一个方法,返回一个结构或者一个类型。
d) 参数数量可变的成员
考虑给数组参数增加params关键字,如果预计用户会传入位数不多的数组元素。
事实上,添加params会使方法变得有二义性兵破坏已有代码
避免使用params数组参数,如果调用方几乎总是有现成的数组作为输入
不要使用params数组参数,如果数组会被以其为参数的成员修改。
考虑在对性能要求非常高的API中为参数数量较少的调用提供特殊的重载以及相应的实现。
这样较少参数调用API时就能避免创建数组对象。
Void Format(string formatString, object arg1)
Void Format(string formatString, object arg1, object arg2)
要注意传入的params数组参数可能为null