一、  参数设计

 

要用类层次结构中最接近基类的类型来作为参数的类型,同时要保证该类型能够提供成员所需要的功能

 

 

假如我们要设计一个方法,把集合进行遍历并把每一项打印到控制台。像这样的方法应该以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

 

相关文章: