【问题标题】:Passing null as default parameter to avoid using parameter将 null 作为默认参数传递以避免使用参数
【发布时间】:2016-05-02 23:41:16
【问题描述】:

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

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# 中的一些明显功能,允许我说“如果没有将任何内容传递给它的相应参数,则不要设置此参数”?

【问题讨论】:

  • 那为什么存在方法重载呢?我会保持标准,所以任何查看代码的人都知道发生了什么
  • @FirstStep 如果有 5 个属性,则需要 32 个重载才能覆盖所有情况。
  • 不是 1 或 2 或 3 或 4 或 5 吗? @rob
  • @FirstStep 否,因为您可以设置:[not 1, not 2]、[1, not 2]、[not 1, 2]、[1, 2] 等等,对于2 个属性。
  • 您希望您的代码根据布尔条件的值做两件不同的事情。 在这种情况下考虑使用“if”语句。

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


【解决方案1】:

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

不是在一个精巧的运算符中,但显然你可以做到

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

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

【讨论】:

    【解决方案2】:

    尝试空合并运算符??

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

    【讨论】:

      【解决方案3】:

      这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 2017-11-08
        • 2014-02-08
        • 1970-01-01
        相关资源
        最近更新 更多