我有Dictionary<string, string>
作为方法参数,我想知道是否有办法让它默认为空字典而不是null
。我更喜欢总是有一个空列表/字典/ IEnumerable而不是null
。我尝试将参数设置为:
Dictionary<string, string> dictionary = default(Dictionary<string,string>);
但评估结果为null
。
有没有办法让默认字典为空?
答案 0 :(得分:9)
有没有办法让默认字典变空?
是的,使用构造函数而不是default
:
void Foo(Dictionary<string, string> parameter){
if(parameter == null) parameter = new Dictionary<string,string>();
}
您还可以将参数设为可选:
void Foo(Dictionary<string, string> parameter = null)
{
if(parameter == null) parameter = new Dictionary<string,string>();
}
optional parameter必须是编译时常量,这就是您无法直接使用new Dictionary<string,string>()
的原因。
根据问题,如果您可以更改default
关键字的行为,则不能返回不同的值。对于引用类型,null
是默认值,将返回。
C#language specs.§12.2:
变量的默认值取决于变量的类型,并确定如下:
更新:对于它的内容,您可以使用此扩展程序(我不会使用它):
public static T EmptyIfNull<T>(this T coll)
where T : ICollection, new() // <-- Constrain to types with a default constructor and collections
{
if(coll == null)
return new T();
return coll;
}
现在您可以这样使用它:
Dictionary<string, string> parameter = null;
Foo(parameter.EmptyIfNull()); // now an empty dictionary is passed
但是,另一个程序员想要看到的最后一件事就是成千上万行的代码遍布.EmptyIfNull()
到处都是因为第一个人懒得使用构造函数。
答案 1 :(得分:2)
考虑到这一点,你想要给出一个不是编译时常量的默认值的任何参数的简单方法在这里工作:不要给它一个默认值。请改用重载函数。
public void Foo() {
Foo(new Dictionary<string, string>());
}
public void Foo(Dictionary<string, string> dictionary) {
...
}
对于调用方而言,实现方式并不重要:重要的是调用Foo()
编译并在运行时与Foo(new Dictionary<string, string>())
具有完全相同的效果,对吧?那么,正是通过添加过载实现了这一点。