天涯一飘絮

导航

 

一、  参数设计

 

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

 

 

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

 

posted on 2009-01-15 11:05  冰云  阅读(140)  评论(0编辑  收藏  举报