2017-08-25 66 views
0

如何简化对象初始值设定项内的条件语句,以便代码更易读?如果addNew为true,则新项目被添加到字典中,否则它将只有一个项目。带条件语句的对象初始值设定项

... 
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 
      } 
} 
... 
+0

可能想用标签标识语言。 –

+0

你可能会想到使用构造函数重载'new ChannelConf(bool addNew)' – ibubi

+0

* *不*使用initalizers中的条件? 'if(addNew){channel.Headers.Add(Constants.Key2,Port); }初始化后是一个巨大的改进。请记住,初始化器只是事后属性分配的简写。你没有得到奖励在一个街区挤压一切。 –

回答

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 } 
} 
... 
0

我想通过参数化构造函数完成事情是一个好习惯。这可能是其他人使用的常见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 
     }; 
}