C# 使Dictionary方法参数默认为空Dictionary,而不是null

C# 使Dictionary方法参数默认为空Dictionary,而不是null,c#,dictionary,default,C#,Dictionary,Default,我有一个Dictionary作为方法参数,我想知道是否有办法将其默认为空Dictionary而不是null。我希望总是有一个空列表/字典/IEnumerable,而不是null。我尝试将参数设置为: Dictionary<string, string> dictionary = default(Dictionary<string,string>); Dictionary Dictionary=默认值(Dictionary); 但其计算结果为null 有没有办法使默认字

我有一个
Dictionary
作为方法参数,我想知道是否有办法将其默认为空Dictionary而不是
null
。我希望总是有一个空列表/字典/IEnumerable,而不是
null
。我尝试将参数设置为:

Dictionary<string, string> dictionary = default(Dictionary<string,string>);
Dictionary Dictionary=默认值(Dictionary);
但其计算结果为
null

有没有办法使默认字典为空

有没有办法使默认字典为空

是,使用构造函数而不是默认值:

void Foo(Dictionary<string, string> parameter){
    if(parameter == null) parameter = new Dictionary<string,string>();
}
现在您可以这样使用它:

Dictionary<string, string> parameter = null;
Foo(parameter.EmptyIfNull());  // now an empty dictionary is passed
字典参数=null;
Foo(parameter.EmptyIfNull());//现在传来一本空字典

但另一个程序员最不想看到的是到处都有成千上万行代码,其中满是
.EmptyIfNull()
,仅仅因为第一个人懒得使用构造函数,对于任何参数,如果您想给出一个不是编译时常量的默认值,那么简单的方法就是:不要给它一个默认值。改用重载函数

public void Foo() {
  Foo(new Dictionary<string, string>());
}

public void Foo(Dictionary<string, string> dictionary) {
  ...
}
public void Foo(){
Foo(newdictionary());
}
公共void Foo(字典){
...
}

对于调用方来说,如何实现并不重要:重要的是调用
Foo()
编译并在运行时具有与
Foo(newdictionary())
完全相同的效果,对吗?嗯,这正是通过添加重载实现的。

我会将其与空合并运算符结合使用。@DanielA.White,我不会。你为什么要这么做?这个答案很容易理解<代码>参数=参数??新字典()冗余地将
参数的先前值重新分配给它自己,让读者想知道为什么会发生这种情况。请注意,尽管OP对使
Foo()
工作感兴趣,但除了函数体中的参数检查之外,还需要一个
Foo(Dictionary parameter=null)
默认值,不是用函数体中的参数检查来代替。@hvd:我提供了另一种方法,可以使
Foo
“工作”,而不必更改方法体中的字典。@TimSchmelter和你一样,我不会使用它。:)我不认为这就是OP所追求的:OP要求一个默认值,因此调用方不会指定任何参数值。您的
EmptyIfNull
将强制调用方写入
默认值(Dictionary).EmptyIfNull()
或添加一个本地未使用的变量。但也许我误解了这个问题。根据我自己对这个问题的理解,我发布了一个不同的答案。不,你不能。如果使用可选参数,则默认参数的值应为编译时常量您的问题有点不清楚。。如果(dictionary==null){dictionary=newdictionary();}
,为什么不直接使用
——意图很清楚,调用方不介意,没有扩展,没有重写行为。。为什么要把事情复杂化?我把“参数”改为“参数”,顺便说一句,我想这就是你的意思。。请参阅以了解差异谢谢大家的评论。我想我要么使用空检查,要么使用方法重载。我问这个问题的原因是我完全同意这篇文章()和其中的这句话(“如果你返回一个空的IEnumerable,而不是一个空的,我会到你家用火箭筒射你的脸。”)空是最糟糕的默认值,唉。。。
Dictionary<string, string> parameter = null;
Foo(parameter.EmptyIfNull());  // now an empty dictionary is passed
public void Foo() {
  Foo(new Dictionary<string, string>());
}

public void Foo(Dictionary<string, string> dictionary) {
  ...
}