Кроме того, что это выглядит очень странно, в этом нет ничего плохого - технически.
Сначала будет выполнено объявление trader
, поэтому существует объект Trader без назначенного значения.
Во-вторых, часть TryGetValue
оценивается и возвращает либо true, либо false. Если он вернул true, теперь будет присвоен присвоенный trader
. Если он возвращает false, новый трейдер создается и добавляется в словарь с помощью операции присваивания. Результатом операции присваивания является значение объекта, который был присвоен. Это новый трейдер.
В-третьих, результат троичного оператора будет возвращен и присвоен trader
.
Маловероятно, что это изменится в будущем, потому что изменение порядка оценки такого утверждения является очень серьезным изменением.
UPDATE:
Потому что это выглядит очень странно, я бы не стал его использовать. Я бы решил эту проблему, создав метод расширения для IDictionary<TKey, TValue>
с именем GetOrAdd
.
Это может выглядеть так:
public static TValue GetOrAdd<TKey, TValue>(this IDictionary<TKey, TValue> dict,
TKey key, Func<TKey, TValue> creator)
{
TValue value;
if(!dict.TryGetValue(key, out value))
{
value = creator(key);
dict.Add(key, value);
}
return value;
}
Вы бы назвали это так:
var trader = traderSet.GetOrAdd(key, k => new Trader(s.gateway, s.broker));
Это намного чище и даже короче, чем ваш странный подход.
Кстати: вы можете использовать ConcurrentDictionary<TKey, TValue>
вместо этого. Этот класс уже имеет метод GetOrAdd
и имеет преимущество в том, что он безопасен для потоков.