将null作为默认参数传递以避免使用参数

时间:2016-05-02 23:41:16

标签: c# null nullable null-coalescing-operator

我创建了一个函数来一次设置对象的多个属性。如果某个参数没有传递给函数,那么我想避免设置/更改它。我能提出的最简洁解决方案的简化示例是:

private void setObjectProperties(MyObject myObject, float param1, bool? param2 = null)
{
    myObject.param1 = param1;
    myObject.param2 = param2 != null ? (bool)param2 : myObject.param2;
}

从这个方法中可以看出,如果在没有传递param2的情况下调用该函数,那么它只会将myObject.param2设置为自身。 (意思是如果没有任何内容传递给param2,则myObject.param2属性不受影响)

对我来说,我看起来有点乱。我不确定这是不是'正确'的事情。我考虑过方法重载,但我认为这会更加混乱;在现实世界的情况下,我传递了两个以上的参数,因此我可能会遇到很多重载。

我是否在C#中遗漏了一些明显的功能,它允许我说“如果没有任何内容传递给它的相应参数,请不要设置此参数”?

3 个答案:

答案 0 :(得分:4)

  

我是否在C#中遗漏了一些明显的功能,这些功能允许我说"如果没有任何内容传递给它,请不要设置此参数"?

不是一个光滑的操作员,但显然你可以做

if(param2.HasValue) myObject.param2 = (bool)param2;

唯一真正的区别是如果你的setter中有任何逻辑,如果参数为null,则不会在这种情况下调用它。

答案 1 :(得分:2)

尝试null-coalescing运算符??

private void setObjectProperties(MyObject myObject, float param1, bool? param2 = null, bool? param3 = null)
{
    myObject.param1 = param1;
    myObject.param2 = param2 ?? myObject.param2;
    myObject.param3 = param3 ?? myObject.param3;
}

你可以调用

foo.setObjectProperties(myobj, param1,
       param2: p2, 
       param3: p3);

答案 2 :(得分:0)

这样做:

private void setObjectProperties(float? param1 = null, bool? param2 = null)
{
    if (param1.HasValue) {
      this.param1 = param1.Value;
    }
    if (param2.HasValue) {
      this.param2 = param2.Value;
    }
}

然后:

MyObject myObject = new MyObject(); 
myObject.setObjectProperties(param1: 1.2f);
myObject.setObjectProperties(param2: true);
myObject.setObjectProperties(param1: 1.2f, param2: true);