, Так как анонимные делегаты были добавлены к 2,0, мы были в состоянии разработать закрытия. Они редко используются программистами, но предоставляют большие преимущества, такие как непосредственное повторное использование кода. Рассмотрите эту часть кода:
bool changed = false;
if (model.Prop1 != prop1)
{
changed = true;
model.Prop1 = prop1;
}
if (model.Prop2 != prop2)
{
changed = true;
model.Prop2 = prop2;
}
// ... etc.
Примечание, что операторы "if" выше выполняют подобные части кода за исключением одной строки кода, т.е. установку различных свойств. Это может быть сокращено со следующим, где переменная строка кода вводится в качестве параметра в Action
объект, соответственно названный setAndTagChanged
:
bool changed = false;
Action<Action> setAndTagChanged = (action) =>
{
changed = true;
action();
};
if (model.Prop1 != prop1) setAndTagChanged(() => model.Prop1 = prop1);
if (model.Prop2 != prop2) setAndTagChanged(() => model.Prop2 = prop2);
Во втором случае, закрытие позволяет Вам определять объем change
переменная в Вашей лямбде, которая является кратким способом приблизиться к этой проблеме.
альтернативный путь состоит в том, чтобы использовать другую неиспользованную функцию, "или равный" двоичный оператор присваивания. Следующий код показывает как:
private bool conditionalSet(bool condition, Action action)
{
if (condition) action();
return condition;
}
// ...
bool changed = false;
changed |= conditionalSet(model.Prop1 == prop1, () => model.Prop1 = prop1);
changed |= conditionalSet(model.Prop2 == prop2, () => model.Prop2 = prop2);
filter_input (INPUT_POST, 'checkbox_name', FILTER_DEFAULT, FILTER_FORCE_ARRAY)