最近学了学C#, 我知道这样不专注不太容易深入,没办法,就当玩吧。
C#继承了C++一个很好的语音特性: 可选参数,就是一个函数的参数可以有缺省值,调用方如果没传,就用缺省值来代替,类似这样:
public void Join(string a, string b="")
{
return a+b;
}
public void test()
{
//这句会返回 This is;
Join("This","is");
//这句会返回 Ok
Join("Ok");
}
Java至今也没有这样简洁的语法,通常只能用函数重载来代替,当缺省参数多的时候,写起来巨麻烦,Java8的Optional类也是个挺丑陋的方案,具体的这里有人详细总结了(Java Optional Parameters --from stackoverflow)
但使用时有两个注意事项:
- 缺省参数只能集中出现在参数列表后面,不能在前面或者中间,这很好理解,要不然如果函数有3个参数, 第二个缺省了, 然后调用方只穿了俩参数,编译器怎么知道调用方到底是想传前两个,还是第一个和第三个呢
- 如果有个参数是数组,还想设置缺省值,是不能设置成这样的:“string[] param = new string[0]”,即使数组元素是基本类型,也会导致编译错误:“可选参数不能初始化为非编译期常量”。究其原因,应该说数组就是个对象,本身不是个常量,空数组也不是。不过好在可以初始化为null。所以可以这样写:
public void Join(string a, string[] b=null)
{
return b==null ? a : a+ string.Join("",b);
}
public void test()
{
//这句会返回 This is an apple;
Join("This",{" is"," an"," apple"});
//这句会返回 Ok
Join("Ok");
}