#c# #resharper
#c# #resharper
Вопрос:
Недавно у нас возникла проблема, когда мы вызывали словарь для извлечения значения, ожидая, что ключ будет присутствовать. Это не привело к прерыванию процесса.
Есть ли у ReSharper функциональность для проверки этого, как я слышал, для нулевых объектов?
Вот пример, подтверждающий то, о чем я говорю:
Dictionary<String, Entity> allEntities =
new Dictionary<String, Entity>(SringComparer.OrdinalIgnoreCase);
allEntities.AddMany(db.GetAllEntities());
Entity thisEntity = allEntities[entityID];
// <-- error here as EntityID isn't in all entities...
Я бы хотел, чтобы ReSharper мог сказать, что я не проверял словарь таким образом:
if (allEntities.ContainsKey(entityID))
...
К вашему сведению, у меня нет ReSharper, но это было бы еще одним дополнением к бизнес-обоснованию, чтобы получить его для всех разработчиков.
Комментарии:
1. Как вы ожидаете, что ReSharper узнает, какие значения выдаст ваш вызов базы данных?
2. Обновленный вопрос с возможным решением…
3. Вы также хотели бы, чтобы он предупреждал вас каждый раз, когда вы делите два целых числа, чтобы проверить, равен ли знаменатель нулю? Вы бы также хотели, чтобы он предупреждал вас каждый раз, когда вы вызываете
string.Substring
, чтобы проверить, находятся ли параметры в пределах строки? Тот факт, что получениеDictionary.Item
выдает aKeyNotFuondException
, если ключ не найден, вряд ли является секретом; некоторые могут сказать, что разработчик C # должен знать это, а не получать напоминания от инструмента…4. Я думаю, что эта функция может быть хорошей, может быть, просто как предложение или подсказка. Проверка, содержит ли словарь ключ, перед получением значения, намного лучше, чем перехват
KeyNotFoundException
Ответ №1:
Даже если бы это было возможно (чего я не думаю, что это так), все, что он сделает, это предупредит вас, что ключа может не быть в словаре — точно так же, как он предупреждает вас, что объект может быть нулевым. На вас по-прежнему лежит ответственность за добавление кода, чтобы проверить, считаете ли вы это необходимым.
Я думаю, что такая функция была бы скорее бременем, чем благословением, если бы она предупреждала вас о каждом вашем доступе к словарю. Тогда вы могли бы утверждать, что хотели, чтобы он предупреждал вас о любом другом типе доступа к коллекции или о любом исключении, которое может быть вызвано. Основное сообщение здесь заключается в том, что вам следует больше полагаться на модульное тестирование для выявления таких проблем, а не на инструменты статического анализа
Редактировать:
Поскольку ReSharper не обладает такой функциональностью, если вы действительно этого хотите, вы можете подумать о том, чтобы написать его самостоятельно с помощью новых API Roslyn. Смотрите Эту статью для примера того, как написать анализатор кода
Ответ №2:
В настоящее время я установил ReSharper 6, и, по крайней мере, с моими настройками, он не предупреждает меня о проверке a Dictionary
ContainsKey
перед доступом к его значению.
Комментарии:
1. Спасибо, это то, что я хотел знать.
Ответ №3:
Resharper — это инструмент, используемый во время компиляции. Как он может узнать, какие значения будут помещены в словарь во время выполнения?
Вы можете проверить словарь, чтобы увидеть, имеет ли он нужное вам значение, прежде чем что-либо с ним делать.
Entity thisEntity;
if (allEntities.TryGetValue(entityID, out thisEntity)){
//DoStuff with thisEntity
}
или просто используйте if (allEntities.ContainsKey(entityID)){}
Комментарии:
1. Я знаю, что могу проверить словарь, чтобы увидеть, есть ли значение, предупреждение, которое я получаю, заключается в том, что я этого не сделал.
2. Вместо этого используйте TryGetValue . Это быстрее, чем сначала проверять, а затем получать его.