Добавьте условие на действии, таким образом, оно только инициировано во время установки, не удаления.
Действие, выполненное только во время Установки
NOT Installed AND NOT PATCH
, Действие работает во время Установки и восстановления
NOT REMOVE
Работавший начальная установка только:
NOT Installed
Работавший начальная установка или когда восстановление выбрано.
NOT Installed OR MaintenanceMode="Modify"
, Чтобы только выполнить действие во время удаления используют следующее условие:
REMOVE~="ALL"
, Чтобы только выполнить действие во время обновления:
Installed AND NOT REMOVE
Когда вложенный класс используется только внешним классом, отличный пример, который больше не нужен, - это класс перечислителя для коллекции.
другим примером может быть перечисление для заменить параметр true false, используемый методом в классе, чтобы уточнить сигнатуру вызова ...
вместо
public class Product
{
public void AmountInInventory(int warehouseId, bool includeReturns)
{
int totalCount = CountOfNewItems();
if (includeReturns)
totalCount+= CountOfReturnedItems();
return totalCount;
}
}
и
product P = new Product();
int TotalInventory = P.AmountInInventory(123, true);
, что оставляет неясным, что означает «истина», вы можете написать:
public class Product
{
[Flags]public enum Include{None=0, New=1, Returns=2, All=3 }
public void AmountInInventory(int warehouseId, Include include)
{
int totalCount = 0;
if ((include & Include.New) == Include.New)
totalCount += CountOfNewItems();
if ((include & Include.Returns) == Include.Returns)
totalCount += CountOfReturns();
return totalCount;
}
}
product P = new Product();
int TotalInventory = P.AmountInInventory(123, Product.Include.All);
Что очищает значение параметра в клиентском коде.
Два места, где я использую вложенные классы:
Вложенный класс используется исключительно внешним классом, и мне нужна полностью закрытая область видимости.
Вложенный класс используется специально для реализовать интерфейс, определенный в другом месте. Например, реализация перечислителя попадает в эту категорию.
Я видел случаи вложенных классов, когда структура данных специального назначения используется только внутри одного класса или определенное исключение выбрасывается и перехватывается только внутри одного класса.
Я иногда использую это для простых вспомогательных классов, которые мне нужны для функции или двух внутри родительского класса.
По «правилам» дяди Боба по сплоченности должны обнаружить, что вы действительно создаете довольно много вложенных (и вложенных, вложенных!) классов. Эти можно сделать невложенными, но только , если у вас есть другие клиенты, которые ссылаются на них сейчас.
Я хотел бы улучшить свой предыдущий ответ!
Особая область, где я регулярно использую вложенные классы, - это включение внедрения интерфейса и инверсии управления. Пример ...
public class Worker
{
private IHelper _helper;
public Worker()
: this (new DefaultHelper())
{
}
public Worker(IHelper helper)
{
this._helper = helper;
}
private class DefaultHelper : IHelper
{
}
}
В качестве практического примера см. Вопрос, заданный ранее этим утром:
Сделать объект доступным только для одного другого объекта в той же сборке?
Резюме: вы можете вложить связанный класс данных внутри бизнес-объекта.
Вы действительно хотите использовать вложенные классы только тогда, когда уверены, что вложенный класс не имеет смысла, что он будет использоваться где-либо еще.
Например, если вам нужно было создать список из нескольких типов объектов, связанных вместе с функциями, и информацию о членах об этом наборе объектов на короткое время (например, методы или свойства), вы можете использовать для этого вложенный класс. . Может быть, вам нужно создать список всех комбинаций какого-либо типа объекта, а затем отметить все комбинации, которые имеют определенное свойство. Это был бы хороший случай для вложенного класса.
Если вам не нужны методы во вложенном классе, вы, вероятно, можете просто использовать struct , но я не знаю, обрабатывает ли IL их по-другому.
Я вкладываю классы, когда у меня есть вспомогательный класс, который не должен быть видимым для любого другого объекта в системе. Это сохраняет видимость как можно более ограниченной, что помогает предотвратить непреднамеренное использование класса