以上的代码可以看出该类继承自Attribute类,对于Attribute类可能不会陌生,那就是定义定制属性的基类,说明ParamArrayAttribute类用于定义定制属性,ParamArrayAttribute类在System命名空间下,ParamArrayAttribute类只有一个构造方法,没有具体的实现。AttributeUsage也定义了属性的使用方式。
C#编译器检测到一个方法调用时,会检查所有具有指定名称、同时参数没有应用ParamArrayAttribute的方法。如果找到一个匹配的方法,编译器生成调用它所需的代码。如果编译器没有找到一个匹配的方法,会直接检查应用ParamArrayAttribute的方法。如果找到一个匹配的方法,编译器会先生成代码来构造一个数组,填充它的元素,再生成代码来调用选定的方法。
调用一个参数数量可变的方法时,会造成一些额外的性能损失,数组对象必须在对上分配,数组元素必须初始化,而且数组的内存最终必须垃圾回收。
提供一个方法代码,仅供参考:
/// <summary>
/// 字符型二维数组转换成DataTable
/// </summary>
/// <param name="stringDyadicArray"></param>
/// <param name="messageOut"></param>
/// <param name="dataTableColumnsName"></param>
/// <returns></returns>
public DataTable DyadicArrayToDataTable(string[,] stringDyadicArray, out bool messageOut,
params object[] dataTableColumnsName)
{
if (stringDyadicArray == null)
{
throw new ArgumentNullException("stringDyadicArray");
}
var returnDataTable = new DataTable();
if (dataTableColumnsName.Length != stringDyadicArray.GetLength(1))
{
messageOut = false;
return returnDataTable;
}
for (var dataTableColumnsCount = 0;dataTableColumnsCount < dataTableColumnsName.Length;dataTableColumnsCount++)
{
returnDataTable.Columns.Add(dataTableColumnsName[dataTableColumnsCount].ToString());
}
for (var dyadicArrayRow = 0; dyadicArrayRow < stringDyadicArray.GetLength(0); dyadicArrayRow++)
{
var addDataRow = returnDataTable.NewRow();
for (var dyadicArrayColumns = 0; dyadicArrayColumns < stringDyadicArray.GetLength(1);dyadicArrayColumns++)
{
addDataRow[dataTableColumnsName[dyadicArrayColumns].ToString()] = stringDyadicArray[dyadicArrayRow, dyadicArrayColumns];
}
returnDataTable.Rows.Add(addDataRow);
}
messageOut = true;
return returnDataTable;
}
以上给出了一个使用可变参数数量以及命名参数的使用样例,完成了将二维字节数组转化为DataTable对象,将数组进行遍历,并将数组写入datatable中,对于整个方法的逻辑就不做深入介绍,代码比较的简单。
三.与参数有关的一些指导原则:
声明方法的参数类型时,应尽量指定最弱的类型,最好是接口而不是基类。








