функционируйте декораторы в c#

Необходимо знать о том, что исходная попытка

int count = map.containsKey(word) ? map.get(word) : 0;

содержит две потенциально дорогих операции на карте, а именно, containsKey и get. Первый выполняет операцию, потенциально симпатичную подобный последнему, таким образом, Вы делаете ту же работу дважды !

при рассмотрении API для Карты, get операции обычно возвращаются null, когда карта не содержит требуемый элемент.

Примечание, что это сделает решение как [1 132]

map.put( key, map.get(key) + 1 );

опасным, так как оно могло бы уступить NullPointerException с. Необходимо проверить на null сначала.

Также примечание , и это очень важно, тот HashMap, s может содержать nulls по определению. Так не каждый возвращенный null говорит, что "нет такого элемента". В этом отношении, containsKey ведет себя по-другому от [1 113] в фактическом сообщении Вам ли существует такой элемент. Обратитесь к API для деталей.

Для Вашего случая, однако, Вы не могли бы хотеть различать сохраненный null и "noSuchElement". Если Вы не хотите разрешать null с, Вы могли бы предпочесть Hashtable. Используя библиотеку-оболочку, как был уже предложен в других ответах, могло бы быть лучшее решение ручной обработки, в зависимости от сложности Вашего приложения.

Для завершения ответа (и я забыл вставлять это сначала благодаря функции редактирования!), лучший способ сделать его исходно, к [1 117] в final переменная, проверьте на [1 119], и put это въезжает задним ходом с 1. Переменная должна быть final, потому что это неизменно так или иначе. Компилятору, возможно, не понадобилась бы эта подсказка, но его более ясное тот путь.

final HashMap map = generateRandomHashMap();
final Object key = fetchSomeKey();
final Integer i = map.get(key);
if (i != null) {
    map.put(i + 1);
} else {
    // do something
}

, Если Вы не хотите полагаться на автоупаковку, необходимо сказать что-то как [1 123] вместо этого.

22
задан jtjin 7 September 2009 в 22:35
поделиться

3 ответа

Это можно сделать с помощью Post Sharp . См. Инструкции в демонстрационном видео.

9
ответ дан 29 November 2019 в 05:31
поделиться
12
ответ дан 29 November 2019 в 05:31
поделиться

вы можете добиться этого с помощью "ContextBoundObject" в .NET framework. но он немного запутан, потому что в основном использует инфраструктуру удаленного взаимодействия .net для перехвата вызовов методов. (накладные расходы времени выполнения минимальны, если ваши вызовы находятся в одном домене приложения, но только в другом «контексте»). так что лучшие подходы будут те, которые упомянуты выше другими плакатами.

4
ответ дан 29 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: