问题阐述
C#中,使用params关键字修饰object类型的数组并作为方法的参数类型,可以解决方法参数不确定的问题,但这里有一个问题,如果调用方法的时候传入的参数是通过某种途径获得的,并且不确定它的值是否为空,那么就有可能把空值传入到方法中,这时,如果方法中的代码逻辑编写得不够严谨,就会产生运行时错误。
专家解答
下面通过一个实例演示为什么使用params关键字时会出现空引用,及其解决方法。
1.问题产生的场景
本实例中,首先定义一个ShowInfo方法,该方法中使用params类型作为参数,然后在Main方法中调用ShowInfo方法,并向该方法传入一个字符串、一个整数、一个null空值,主要代码如下:
class Program
{
//应用程序入口方法
staticvoid Main(string[] args)
{
Program p = new Program();
p.ShowInfo("bccd", 100, null);
}
//自定义方法,实现输出该方法自身的参数列表
privatevoid ShowInfo(params object[] parameters)
{
string strOutPut = string.Empty;
for(int i = 0; i
{
strOutPut += parameters[i].ToString() + "\r\n";
}
Console.WriteLine("参数列表:\n",strOutPut);
Console.Read();
}
}
编译后在运行过程中出现空引用异常提示,如图7.14所示。
图7.14 空引用异常提示
2.问题分析
在出现异常的语句处设置断点,并添加对for语句的局部变量i的快速监视,如图7.15所示。
图7.15 变量i的快速监视窗口
通过查看快速监视得知,出现问题的参数索引值为2,也就是ShowInfo方法在被调用时传入的第3个参数,由于该参数被传入了空值,所以在调用Tostring方法时产生了空引用异常。
3.问题的解决方法
解决办法就是修改ShowInfo方法中的代码,增加关于空值的逻辑判断,然后对空值的情况作特殊处理,修改后的代码如下:
private void ShowInfo(params object[] parameters)
{
stringstrOutPut = string.Empty;
for (inti = 0; i
{
if(parameters[i] == null) //如果参数值为空值
{
strOutPut += "null" + "\r\n"; //对输出字符串做特殊处理
}
else //如果参数值不为空
{
strOutPut += parameters[i].ToString() + "\r\n"; //保持原有的输出格式
}
}
Console.WriteLine("参数列表:\n", strOutPut);
Console.Read();
}
注意:在方法声明中,params关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个params关键字。
专家点评
在编写方法时,可能会遇到这样的问题,不确定这个方法要传入多少个参数,或者随着程序的开发进度,该方法的参数会发生很大变化,为了支持不确定个数的参数传入,在C#中可以使用params关键字来修饰方法的参数。
领取专属 10元无门槛券
私享最新 技术干货