Я также обнаружил, что System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke()
не всегда является диспетчером целевого контроля, точно так же, как dotNet пишет в своем ответе. У меня не было доступа к диспетчеру управления, поэтому я использовал Application.Current.Dispatcher
, и он решил проблему.
Всегда фигурные скобки использования:
if(boolean)
oneliner();
nextLineOfCode();
не то же как:
if(boolean)
{
oneliner();
}
nextLineOfCode();
, Если острота () является функцией #defined, и она не определяется тогда, Ваша следующая строка кода внезапно становится подвергающейся если (). То же самое относится за циклы и т.д. С фигурными скобками тогда, следующая часть кода никогда неумышленно становится условным выражением на если/для и т.д.
Лучшие 3 защитных метода кодирования, которые я использую,
нет никакой лучшей защиты по качеству Вашего кода, чем хороший модульный тест для поддержки Вас.
Это - простое и очевидное, но я НИКОГДА НИКОГДА не повторяю ту же строковую константу дважды в моем коде, вызываю, я ЗНАЮ, что, если я, я буду записывать одного из них неправильно:) Константы использования, люди!
Всегда помещайте фигурные скобки после if/for/while..., даже если существует только один отдельный оператор после. BTW D. Crockford думает, что это лучше также: Необходимые блоки
При сравнении строки с константой запишите
if ("blah".equals(value)){}
вместо
if (value.equals("blah")){}
для предотвращения NullPointerException. Но это - единственное время, я использую предложенный стиль кодирования (причина, "если (= 1)..." не возможно в Java).
Одна из вещей, которые я всегда пытаюсь помнить, когда я нахожусь в мире JavaScript, состоит в том, чтобы всегда запускать возвращаемое значение функции на той же строке как слово клавиши Return.
function one(){
return {
result:"result"
};
}
function two(){
return
{
result:"result"
};
}
Эти 2 функции не возвратят то же значение. Первая функция возвратится, Объект со свойством заканчивается набор для "заканчиваний". Вторая функция возвратится undefined
. Это - действительно простая ошибка, и это происходит из-за фанатичной стратегии Вставки Точки с запятой JavaScript. Точки с запятой являются полудополнительными в JavaScript и из-за этого, механизм JavaScript добавит полуенотов, где это думает, что это, должен быть. Поскольку return
на самом деле допустимый оператор, точка с запятой будет вставлена после того, как оператор возврата и остальная часть функции будут по существу проигнорированы.
Из моего блога:
Думают положительные и возвращаются рано плюс, избегают глубокого вложения. Вместо
, если (значение! = пустой указатель) {... делают что-то со значением...} возврат
запись
, если (значение == пустой указатель) {возврат}... делают что-то со значением...
Избегают "строковых констант" (т.е. тот же текст в кавычках больше чем в одном месте). Всегда определяйте вещественную константу (с именем и дополнительным комментарием, что это означает), и используйте это.
Лично, мне не нравится этот защитный стиль, он делает код трудным чтением ro.
уровень 4 предупреждения компилятора VC определит эту (возможную) ошибку.
"предупреждение C4706: присвоение в условном выражении"
можно включить просто это определенное предупреждение компилятора на любом уровне:
#pragma warning(3,4706)
const
везде, где я могу (не используя mutable
) -Wall -Wextra -ansi -pedantic -Werror
как минимум) bash
-> grep
-> awk-> Python-> C++). Я прекратил использовать языки, где можно сделать
if a = 5: print a
, Это сохранило меня тонны головных болей =).
На более серьезной ноте... Я теперь всегда пишу фигурные скобки прямо после того, как я запишу мой if
с и for
циклы, и затем заполню их впоследствии. Это удостоверяется, что мои скобки всегда выровненные.
Возврат копии изменяемого объекта, т.е. копии массива, не самого изменяемого объекта.
Вещи пары:
Избегайте ненужного теста. Пример
РЕДАКТИРОВАНИЕ: если (указатель) не читаем поэтому в наше время, я предпочитаю если (ПУСТОЙ УКАЗАТЕЛЬ! = указатель)
Установленный Resharper;) Тогда я не должен писать "5 ==", чтобы быть предупрежденным, сделал ли я что-то не так:)
Несколько предложений по встроенному программированию на C в статье Rules for Defensive C Programming с embedded.com.