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

Passing null as default parameter to avoid using parameter

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

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 属性 将保持不变)

我觉得我的东西有点乱。我不确定这是否是 'correct' 要做的事情。我考虑过方法重载,但我认为这会更加混乱;在现实世界的情况下,我传递了两个以上的要设置的参数,所以我最终可能会遇到很多重载。

我是否缺少 C# 中允许我说 "Don't set this parameter if nothing is passed to it's corresponding argument" 的一些明显功能?

这样做:

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);

Am I missing some obvious functionality in C# that allows me to say "Don't set this parameter if nothing is passed to it's corresponding argument"?

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

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

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

尝试空合并运算符 ??:

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);