【问题标题】:Object initializer with conditional statement带有条件语句的对象初始化器
【发布时间】:2018-02-03 23:08:12
【问题描述】:

如何简化对象初始值设定项中的条件语句,使代码更具可读性?如果 addNew 为真,则将新项添加到字典中,否则它将只有一项。

...
var channel = new ChannelConf {
Name = "Abc"
Headers = !addNew ?  new Dictionary<string, string> 
          { 
               [Constants.Key1] = Id
          }
          : new Dictionary<string, string>
          {
               [Constants.Key1] = Id,
               [Constants.Key2] = Port
          }
}
...

【问题讨论】:

  • 可能想用标签来识别语言。
  • 你可能会想到使用构造函数重载new ChannelConf(bool addNew)
  • not 在初始化器中使用条件语句怎么样? if (addNew) { channel.Headers.Add(Constants.Key2, Port); } 初始化后是一个巨大的改进。请记住,初始化器只是事后属性分配的简写。你不会因为把所有东西都挤在一个街区里而获得奖励。

标签: c# object initializer


【解决方案1】:

你可以调用一个方法来初始化Headers:

...
new ChannelConf {
Name = "Abc"
Headers = GetNewDictionary(addNew)
}
...

private Dictionary<string, string> GetNewDictionary(bool addNew)
{
    Dictionary<string, string> output = new Dictionary<string, string> { [Constants.Key1] = Id };

    if (addNew) { output.Add(Constants.Key2, Port); }

    return output;
}

或者,您可以保持原样并减少行数:

...
var channel = new ChannelConf {
Name = "Abc"
Headers = !addNew ?  new Dictionary<string, string>  { [Constants.Key1] = Id }
          : new Dictionary<string, string> { [Constants.Key1] = Id, [Constants.Key2] = Port }
}
...

【讨论】:

    【解决方案2】:

    我认为让事情通过参数化构造函数完成是一个好习惯。它可能是其他人使用的常见 api,因此您可以轻松记录,而不必告诉消费者应该如何使用该 api。

    public ChannelConf(bool addNew)
    {
        Headers = !addNew
            ? new Dictionary<string, string>
            { [Constants.Key1] = Id }
            : new Dictionary<string, string>
            {
                [Constants.Key1] = Id,
                [Constants.Key2] = Port
            };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2019-05-30
      • 1970-01-01
      相关资源
      最近更新 更多